不管哪种语言都逃不脱控制流的概念,所谓万变不离其宗——重要的是思想!
其实本文主要是介绍“上下文”的(重要!!)
和Java等语言不同的是,Perl的foreach循环变量就是列表元素本身(而不是其副本),这意味着如果在循环中修改了循环变量的值也就修改了元素的值`
@rocks = qw/nedrock slate lava/;
foreach $rock(@rocks){
$rock = "\t$rock";
$rock.="\n";
}
print "The rocks are:\n", @rocks; #各自占一行并使用缩排
当循环结束后,循环变量会自动恢复到循环前的值
假如在foreach循环开头没写循环控制变量,Perl使用默认的变量$_,该变量除了名字比较特殊其它没什么特别的
foreach (1..10){
print "I can count to $_\n";
}
reverse:读取列表/数组的值并逆序返回该列表
@rearr = reverse(1..10) #从10到1
sort:读取列表/数组的值并按照字符编码顺序排序
@ rocks = sort @rocks;
each操作符从Perl5.12版引入,该函数返回索引和对应的值(用于提取哈希键值对)
use 5.12
my @rocks = qw/bedrock slate rubble granite/;
while(my($index, $value) = each @rocks){
say "index: $value";
}
和下面的做法是等价的:
@roks = qw/bedrock slate rubble granite/;
foreach $index(0..$#rocks){
print "index: $rocks[$index]\n";
}
划重点!!划重点!!
42 + sth #这里sth必须是一个标量
sort sth #这里sth必须是一个列表
@people = qw(AA BB DD CC);
@sorted = sort(@people); #列表上下文:AA BB CC DD
$num = @people + 3; #标量上下文:4+3=7,得7
@arr = @people #列表上下文:得到四个人的姓名列表并复制给arr
@var1 = @reverse qw/yabba dabba doo/; #doo,dabba,yabba
var2 = @reverse qw/yabba dabba doo/; #oodabbadabbay
$var = sth; #标量上下文
@arr = sth; #列表上下文
($a,$b) = sth #列表上下文
($a) = sth #还是列表上下文
在列表上下文中使用产生标量的表达式
@arr = 2*3; #产生仅有一个元素6的列表
@arr = "hello".''."world"; #产生仅有一个元素"hello world"的列表
强制指定标量上下文
使用伪函数 scalar
@arr = (1,2,3);
print "There are scalar @arr elements in the array.\n";
Perl中,
@lines = <STDIN>; #在列表上下文中读取标准输入
如果输入来源是键盘,Unix系统使用ctrl+D
表示文件结尾,而Windows系统是ctrl+Z
这些从键盘输入的表示文件结尾的符号也会被送入数组元素
通常使用chomp
函数去掉所有的换行符
chomp(@lines = <STDIN>);
=pod
@lines = <STDIN>;
chomp(@lines); #这两行和上面是等价的
=cut
最后说一下,一个文件被读进数组需要的内存通常远远超过文件本身的大小(400MB的文件可能会占据至少1GB内存),因为Perl会分配赋予的空间来节省事后的操作时间