perl子程序的运用及子程序中变量私有(my)声明的重要性


一个转换程序,简单的把DNA序列中的A转变成T,第一种情况没有使用私有变量。


#!/bin/perl
#下面是一段DNA序列
$DNA=ATTATATAT;#这里是我们的序列
$result=A_to_T($DNA);
print "I changed all $DNA A to T, and the we get the result $resultnn";

sub A_to_T
{
my ($input)=@_;
$DNA=$input;#没有使用私有变量
$DNA=~s/A/T/g;
return $DNA;
}

结果如下:
F:>perla.pl
I changed all TTTTTTTTT A to T, and the we get the result TTTTTTTTT

F:>
这里我们发现$DNA的值变成了TTTTTTTTT,而不是以前ATTATATAT。这是因为在子程序中,我们使用了同样的$DNA 变量,而在子程序中它的值已经被改变了。所以输出的时候就是改变以后的值。

下面把子程序中的 $DNA 进行私有变量声明:


#!/bin/perl
#下面是一段DNA序列
$DNA=ATTATATAT;
$result=A_to_T($DNA);
print "I changed all $DNA A to T, and the we get the result $resultnn";

sub A_to_T
{
my ($input)=@_;
my $DNA=$input;
$DNA=~s/A/T/g;
return $DNA;
}

结果如下:
F:>perla.pl
I changed all ATTATATAT A to T, and the we get the result TTTTTTTTT

F:>

这样就正常了。

当然你可以说,在子程序中可以完全不用$DNA这一个变量,就如同下面一样:


#!/bin/perl
#下面是一段DNA序列
$DNA=ATTATATAT;
$result=A_to_T($DNA);
print "I changed all $DNA A to T, and the we get the result $resultnn";

sub A_to_T
{
my ($input)=@_;
$dna_to_change=$input;
$dna_to_change=~s/A/T/g;
return $dan_to_change;
}

得到的也是正常的结果:
F:>perla.pl
I changed all ATTATATAT A to T, and the we get the result

F:>

但是,没有人能够保证你不会一时糊涂,在子程序用了程序中的变量。或者当你第一次使用的时候,可以避免,当你过来几个月以后回过头再来使用的时候,就不能保证完全正确了,所以为了代码的通用性,还是在所有的子程序中使用my私有变量吧。

perl push的用法及子程序返回值的反思
pop操作将数组的最后一个元素取出并返回:@array=5..9;$fred=pop(@array);#$fred得到9,@array现在为(5,6,7,8)$barney=pop@array;#$barneygets8,@array现在为(5,6,7)pop@a

perl pop push shift unshift实例介绍
学习记录一下#!/usr/bin/perl-wusestrict;print'@a@b@c@d的值都为123',"n";my@a=(1..3);pop(@a);print"@a的值为@a,pop拿掉数组最右边的值n";my@b=(1..3);push(@b,'4');print"@b的值为@

perl ping检测功能脚本代码
我的第一个用于生产环境的perl脚本,虽然不是很优秀,但也迈出了扎实的一步:)领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知