Perl语言入门:foreach和联系上下文

不管哪种语言都逃不脱控制流的概念,所谓万变不离其宗——重要的是思想!

其实本文主要是介绍“上下文”的(重要!!)


foreach循环

和Java等语言不同的是,Perl的foreach循环变量就是列表元素本身(而不是其副本),这意味着如果在循环中修改了循环变量的值也就修改了元素的值`

@rocks = qw/nedrock slate lava/;
foreach $rock(@rocks){
    $rock = "\t$rock";
    $rock.="\n";
}
print "The rocks are:\n", @rocks;   #各自占一行并使用缩排

当循环结束后,循环变量会自动恢复到循环前的值


Perl的默认变量:$_

假如在foreach循环开头没写循环控制变量,Perl使用默认的变量$_,该变量除了名字比较特殊其它没什么特别的

foreach (1..10){
    print "I can count to $_\n";
}

reverse和sort操作符

reverse:读取列表/数组的值并逆序返回该列表

@rearr = reverse(1..10) #从10到1

sort:读取列表/数组的值并按照字符编码顺序排序

@ rocks = sort @rocks;

each操作符

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会分配赋予的空间来节省事后的操作时间

你可能感兴趣的:(Perl,语言)