perl删除字符串中的重复字符

在设计KASP引物时,需要知道双等位基因型对应的碱基,这就需要从GT中却除重复的基因型,可以参考下面的代码:

#!/usr/bin/perl
use strict;
use warnings;
my $string="A/C	A/C	A/C	A/C	A/C	A/A	A/C	A/A	A/C	A/C	A/C	A/C	A/A	A/C	A/C	A/A";
$string=~s/\s+//g;
while($string =~ s/((.).*)\2+/$1/g) {};
print $string."\n";

perl循环读取文件时判断是否到最后一行

当需要去掉序列的分行符或者是建立序列的索引时,当序列文件较大时,不好将文件读入内存,需要一行一行的去读取,但怎样判断到了文件最后一行呢,在perl中一般用eof函数,但 eof 和带空圆括弧对 () 的 eof()表示的意思是不一样的,特别容易混淆。带圆括弧的 eof() 只是检测一组文件中的最后一个文件的文件结束,而 eof(没有圆括弧)在 while (<>) 循环里检查每个文件的文件结束。下面是建立fasta文件索引的代码。

#!/usr/bin/perl
use strict;
use warnings;
my $genome_file = “genomic.fna";
open(F, $genome_file);
#open(OUT, ">outfile");
my %chr2seq;
my $id="";
my $seq="";
while(<F>){
	if(/^>(\S+)/){
		if($id){
			$chr2seq{$id}=$seq;
			$seq="";
		}
		$id=$1;
	}else{
		s/\s+$//;
		$seq.=$_;
	}
	if(eof){
		$chr2seq{$id}=$seq;
	}
}

perl批量导入手机号码和邮箱

当单位或者公司发布通讯录时,会增加很多新的联系人,一个一个的导入实在是太麻烦了,所以打算自己写个代码生成个联系人文件,然后导入手机中就可以了,费话不多说,开干。

首先 将联系人信息用EXCEL整理成三列 ,第一列为姓名,第二列为手机号码,第三列为邮箱,其它也是可以加一些分组信息和地址之类的信息,但考虑信息越详细,信息泄露的后果就越严重,因此只选择添加手机号码和邮箱。整理好后复制到一个”input.txt”的文本文件,可以用记事本创建。运行下面perl程序。

将生成的“contacts.vcf”文件传到手机,然后用“联系人”或“电话本”打开这个文件,就会提示导入联系人,成功导入后,选择手机中的整理联系人,合并名字重复的联系人就可以了。

#!/usr/bin/perl
##用perl处理Excel通讯录(从Excel复制到input.txt),最后形成vCard的
###############################################################
#input.txt文件格式如下:
#第一列姓名,第二列手机号码,第三email,中间制表符分开
###############################################################
#比如输入文件内容如下:
#张三 手机号码 email
#李四 手机号码 email
###############################################################
#输出内容如下:
#BEGIN:VCARD
#VERSION:2.1
#N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=9D=8E=E5=9B=9B;;;
#FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=9D=8E=E5=9B=9B
#TEL;CELL:1234567
#EMAIL;X-internet:yuyin110110110@163.com
#END:VCARD
###############################################################
##perl convert2vcf.pl 
##Eidit by XiaowenH 2020-05-20
###############################################################
use strict;
use warnings;

#先打开读取文件内容,保存到数组里面
open(FH, "input.txt");#读取通讯录
my @data=<FH>;
close(FH);
#输出结果
open(OUT,">contacts.vcf"); #输出通讯录
foreach my $line (@data){
    $line=~s/\s+$//;
    my @l=split/\t/,$line;
    my $name = $l[0];
    $name=~s/^\s+//g;  ###去掉名字开头和结尾空格
    $name=~s/\s+$//g;

    my $phone="";
    if(exists $l[1]){
        $l[1]=~s/^\s+//g; ###去掉电话号码开头和结尾空格
        $l[1]=~s/\s+$//g;
	$phone=$l[1];
    }

	
    my $email = "";
    if(exists $l[2]){
	$email = $l[2];
    }
    print OUT "BEGIN:VCARD\n";
    print OUT "VERSION:2.1\n";
    print OUT "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;$name;;;\n";
    print OUT "FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:$name\n";  #姓名
    print OUT "COUNTRYISO:CN\n";
    print OUT "TEL;CELL:$phone\n";#手机号
    print OUT "EMAIL;X-internet:$email\n";#邮箱
    print OUT "END:VCARD\n";
}
close(OUT);

Perl输出函数传递的二维数组

最近用DBI模块写个了mysql接入函数,但得到的return一直不能输出结果,后来经过思考,原来是二维数组传递的问题,终于解决了,特此为记。

下面这个是mysql接入函数:

sub mysql_connect(){
        use DBI;
	my ($sql,$db)=@_;
	my $usr="selectonly";
	my $passwd="yuyin_110";
	my $dbh=DBI->connect("DBI:mysql:$db",$usr,$passwd);

	if(!$dbh){
		print "connect lost\n";
	}else{
		my $sth=$dbh->prepare($sql)or die "Can’t prepare $sql: $dbh->errstr\n";
		$sth->execute()or die "Can’t execute the query: $sth->errstr";
		my $data=$sth->fetchall_arrayref();
		$sth->finish;
		return $data;
	}
}

现在的问题是输出$data的内容,而$data返回的是一个二维数组的引用地址,可以用以下方法分层输出这个数组:

	my $sql="select * from test limit 1000";
	my $b=mysql_connect($sql,"test");
	my @r=@$b;    #####因为$b获得的只是一个引用地址,可以用@变成数组,这个数组这储存了一系列一维数组地址
	foreach(@r){
		my @each=@$_;            ######道理与获得二维地址一样
		foreach(@each){
			print  $_."\t";
		}
		print  "\n";

	}

perl DBI模块详解

Perl DBI是Perl数据库接口(Perl Database Interface,简称DBI)。通过提供一系列在内部上能够转化成原始调用函数的功能,DBI模块为很多不同的数据库提供了一个统一的接口,包括mysql,Oracle等。
可移植的DBI方法:
connect 建立到一个数据库服务器的连接
disconnect 断开数据库服务器的连接
prepare 准备执行一个SQL语句
继续阅读