本质就是数组,几个比较有意思的地方:
@array = undef; # 得到一个仅有一个元素undef的列表,undef是标量
@array = (); # 清空数组
类似Python的List,一些典型的例子:
print (1, 2, 3);
print (1, 2, 3,); # 同(1,2,3),末尾的逗号会被忽略
print ("vivi", 4.5); # 两个元素,vivi和4.5
print (); # 空列表
print (1..5); # 同(1,2,3,4,5),..是范围操作符
print (1.7...5.7); # 同(1,2,3,4,5),小数被向下取整
print (5..1); # 同(),..只能向上计数
qw操作符(quoted word):可以建立单词列表。所有的空白符(如空格、制表符、换行符)都会被视为单词间的间隔符。定界符()或{}是可以选的,只要配对就行。
print qw(a b c d e) # 同qw{a b c d e}
列表赋值:@操作可以引用整个数组。
print qw(a b c d e); # 同qw{a b c d e}
($a[0],$a[1],$a[2]) = qw(a b c);
@a = qw(a b c);
@b = @a; # 复制数组的元素到另一个数组
@array = 5..9;
$fred = pop(@array); # fred变成9,数组变成(5,6,7,8)
pop @array; # 数组变成(5,6,7)
push @array, $fred; # 数组变成(5,6,7,9)
类似push和pop,只是操作位置改为了数组开头。
@array = qw{dino fred barney};
$m = shift @array; # ('fred','barney')
unshift @array, 4; # (4,'fred','barney')
@array = qw{a b c d e};
@removed = splice @array, 2;
print @array,"\n"; # (a,b)
print @removed,"\n"; # (c,d,e)
@array = qw{a b c d e};
@removed = splice @array, 2, 2;
print @array,"\n"; # (a,b,e)
print @removed,"\n"; # (c,d), 2表示长度
@array = qw{a b c d e};
@removed = splice @array, 2, 2, qw(x y);
print @array,"\n"; # (a,b,x,y,e), 将qw(x y)替换进指定位置
print @removed,"\n"; # (c,d),2表示长度
@rocks = qw{ b c d };
print "a@rocks e"; # ab c d e
print "a @rocks e"; # a b c d e
@fred = qw(a b c);
$fred = "right";
print "this is $fred[2]\n"; # this is c
print "this is ${fred}[2]\n"; # this is right[2]
$rock = 'shale';
@rocks = qw{bedrock slate lava};
foreach $rock (@rocks){
$rock .= "a\t"; # 在末尾加上a\t
}
print @rocks; # bedrocka slatea lavaa, 列表被改变了
print $rock; # shale, 控制变量$rocks循环结束会还原
没有指定控制变量$rocks时,可以使用默认的控制变量:$_。
@array = 1..5;
@new = reverse @array;
print @array; # 12345
print @new; # 54321
@array = 97..102;
@new = sort @array;
print @array, "\n"; # 97 98 99 100 101 102
print @new, "\n"; # 100 101 102 97 98 99
@rocks = qw{a b c d e};
while(($index, $value) = each @rocks){
print "$index: $value\n";
}
0: a
1: b
2: c
3: d
4: e
[Finished in 0.1s]
类似于Python里的enumerate:
rocks = ['a', 'b', 'c', 'd', 'e']
for index, value in enumerate(rocks):
print index, ":", value
看到这一部分内容感觉很不适应,好像从来没有一门编程语言如此强调所谓的上下文环境。书里特别强调了,这节是理解Perl的重中之重。所谓上下文,指的是你如何使用表达表。即同一个表达式,在不同的上下文中,会表现出不同的意义。比如:
@people = qw{fred barney betty};
@sorted = sort @people; # 列表上下文:barney, betty, fred
$number = 42 + @people; # 标量上下文:42+3,得45
根据不同的上下文环境,@people表现出了不同的内容。这种特性,哪怕是在Python里都是不允许的。看到这里发现Perl比Python还要飘逸。这无形中加重了程序员的负担。比如,上面这个例子,Python解释器会认为是语法错误,而提示程序员去修改代码。但是在Perl中,这种语法是合理的,这意味着程序员必须很了解在不同的上下文环境中,一个表达式会表现出什么含义。对于资深Perl程序员而言,这可能可以使代码更加简洁。但是却提高了外行Perl程序员的阅读难度。欢迎资深Perl程序员来为Perl的这个特性洗白。
通过关键字scalar可以强制指定后面这个表达式为标量上下文:
@rocks = qw{a b c d};
print "I have ", @rocks, " rocks!\n";
print "I have ", scalar @rocks, " rocks!\n";
批量读入行:
chomp(@lines = );
print @lines;
程序不断从标准输入读入数据,直至通过Ctrl+D(Unix)或Ctrl+Z(Windows)来发送文件结尾标记。
print reverse (@lines = );
或
print reverse ;
@names = qw{fred betty barney dino wilma pebbles bamm-bamm};
chomp(@lines = );
foreach (@lines){
print @names[$_-1], "\t";
}
chomp(@lines = );
foreach (sort @lines){
print $_, "\t";
}
或
chomp(@lines = );
@sorted = sort @lines;
print "@sorted\t";