背景知识--my变量
- 全局变量:在脚本中的任何位置都可使用;
- 私有变量:只在程序块大括号{}内起作用。
当脚本开头声明
use strict;
时,定义新的变量都需要加my
,以满足严格的语法要求;在之后使用使用变量时就不用了。
#!/user/bin/perl -w
use strict;
my $whole="whole variable";
{
my $local="local variable";
print "$whole\n";
print "$local\n";
}
1
#!/user/bin/perl -w
use strict;
my $whole="whole variable";
{
my $local="local variable";
}
print "$whole\n";
print "$local\n";
2
从上面两个例子中可以看出在大括号外定义的变量在脚本的任何位置都可使用;而在模块大括号内定义的只能在该括号内使用。在今后的perl脚本中定义新的变量都最好前面加一个
my
,语法严谨。
认识子程序
1、sub函数定义与使用
-使用sub函数定义一个子程序,使用模式如下
sub <name> { }
sub print_hello {
print "Hello,world!"
}
子程序名的命名同样不能以数字开头,且不能与已有的冲突。
2、&调用
如上例
&print_hello;
2、设置子程序参数
复杂一点的子函数都能指定特定的功能,需要我们输入参数从而返回结果;一个简单的加法例子如下。
#!/user/bin/perl -w
use strict;
sub sum {
my $num1=shift @_;
my $num2=shift @_;
my $total=$num1+$num2;
return $total;
}
my $total= &sum (5,2); #此$totel 非上面那个$totle
print "$total\n";
- 如上给子程序的参数为一个数组(5,2);配合
@_
默认变量赋值到子程序中计算。 -
return
表示立即返回子函数的值;如果不用return,子函数默认返回最后一个表达式的值。一般都会加上的。
子程序生信实例
目的:统计每个序列文件内序列个数以及序列平均长度。
-
这里我们除需要原始序列文件外,还需要一个序列文件的名字与文件路径的清单,如下:
gene.list
基因序列文件
#!/usrr/bin/perl -w
use strict;
open IN,"<$ARGV[0]"; #gene.list
while (<IN>) {
chomp; #去掉每行的换行符
my ($id,$file)=(split /=/,$_)[0,1];
#以等号分隔成两个字串符,分别赋值给两个变量$id,$file
my ($gene_num,$gene_length)=&gene_stat ($file);
#使用子函数,加参数为上面求得的路径$file;
# 由此可见sub函数顺序可以最后面,事实上大多数人都习惯放最后
print "$id\t$gene_num\t$gene_length\n";
}
close IN;
# 接下来来写子程序
sub gene_stat {
my $file = shift @_;
#@_ 为上面赋值给子程序的参数$file,即为序列;利用shift转移一下。
#与上面的$file不冲突,因为在大括号内,为局部变量。
my $genenum=0;
my $genelength=0;
open FA,"$file"; #打开目标序列文件
while (<FA>) {
chomp;
if (/^>/) { #设置条件:是否为以>开头的行
$genenum+=1;
} else {
my $len=length ($_);
$genelength+=$len;
}
}
close FA;
my $avg_length=$genelength/$genenum;
return $genenum,$avg_length; #直接返回到屏幕
}
perl -c 1.pl
perl 1.pl gene.list
统计序列数与平均长度