pop, push, shift, unshift
pop
和push
删除/新增元素到数组末尾,返回数组最后一个元素。
shift
和unshift
删除/新增数组第一个元素,返回第一个元素。
splice
删除并返回给定位置的元素。替换/添加新列表
foreach 控制结构
逐项遍历列表中的值,依次提取使用。
如果省略控制变量,perl会用$_
。
foreach (1..10){
print "I can count to $_!\n";
}
I can count to 1!
...
I can count to 10!
reverse 操作符
读取列表的值,并按相反次序返回新的列表。
sort操作符
排序
each
每次对数组调用each, 会返回数组中下一个元素对应的两个值——数组索引与元素值,类似返回键值对。
@rock = (qw/ bedrock slate lava /);
while(($index, $value) = each @rock){
print "$index:$value\n"
}
0:bedrock
1:slate
2:lava
子程序
有些情况,调用子程序会在其名字前加上&
号。子程序名归属于独立的名字空间(namespace),因此同名子程序和标量不会搞混。
定义子程序
sub开头+子程序名+{程序主体}
调用:名称前+&
在perl中,所有子程序都有一个返回值,并且是执行过程中最后一次运算的结果,无论是什么都会被当作返回值。最后语句若为print
则会返回1
sub sum_of_fred_and_barney {
print "Hey, you called the sum_of_fred_and_barney subroutine!\n";
$fred + $barney;
}
$fred = 3;
$barney = 4;
$wailma = &sum_of_fred_and_barney;
print "\$wailma is $wailma.\n";
$betty = 3 * &sum_of_fred_and_barney;
print "\$betty is $betty.\n"
Hey, you called the sum_of_fred_and_barney subroutine!
$wailma is 7.
Hey, you called the sum_of_fred_and_barney subroutine!
$betty is 21.
传入参数
在子程序调用的后面加上括在括号内的列表表达式就行了。
perl会自动将参数列表化为特殊的数组变量@_ ,子程序的第一个参数储存于
[
0
]
,
第
二
个
参
数
储
存
于
_[0],第二个参数储存于
[0],第二个参数储存于_[1],依此类推。
sub max {
if($_[0] > $_[1]){
$_[0];
} else {
$_[1];
};
};
子程序的私有变量
默认情况下perl里所有变量都是全局变量,在程序里任何地方都可以访问他们。但你随时可以借助my操作符来创建私有变量,称之为词法变量(lexical variable):
sub max {
my($m,$n);
($m,$n) = @_;
#只有代码简单到只有一行时,才可以省略;
if($m > $n){$m} else {$n}
};
my
操作符可以应用到括号内的变量列表,所以一般会将这个子程序中的前两行语句合并起来:
my($m.$n) = @_;
改进&max
,使它能够接受任意数目的参数:
sub max {
my($max_so_far) = shift @_;
foreach (@_){
if($_ > $max_so_far){
$max_so_far = $_;
};
};
$max_so_far;
};
my
声明的词法变量可用在任何语句内,并不限于子程序的语句块。my
没加()时,只能用来声明最近的单个词法变量。在日常的Perl编程中,最好对每个新变量都使用my声明。
return
立即返回某个值,而不再执行子程序的其余部分。
省略&号
一般参数列表放入括号中。就一定是函数调用,就可以省略&号。
my @cards = shuffle(@deck_of_cards);
持久化私有变量
state
声明可以将当前子程序变量持久私有化。
use v5.10;
running_sum(5,6);
running_sum(1..3);
running_sum(4);
sub running_sum {
state $sum = 0;
state @numbers;
foreach my $number (@_){
push @numbers, $number;
$sum += $number;
}
say "The sum of (@numbers) is $sum";
}