在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
列表(list)指的是标量的有序集合,而数组(array)则是存储列表的变量。 访问数组中的元素: 数组元素是以连续的整数来编号,从0开始,之后的每一个元素依次加1,如: $fred[0]="yabba"; $fred[1]="dabba"; $fred[2]="doo"; 当然,任何求值能得到数字的表达式都可以用作下标,如果不是整数,会自动舍去小数,无论正负: print $fred[2.71828-1]; #等同于print $fred[1] 假如下标超出数组尾端,对应的值是undef 特殊的数组索引值: 数组rocks的最后一个元素的索引值是$#rocks,如$rocks[$#rocks]; 负数表示倒数,因此$rocks[-1]等同于$rocks[$#rocks]
列表直接量(list literal,也就是在程序代码中表示一列数据的写法),可以由圆括号内用逗号隔开的一串数据表示,而这些数据就称为列表元素,如 (1,2,3) ("fred",4.5) (1..5) #范围操作符..,从左边的数字计数到右边,每次加1,等同于(1,2,3,4,5),只能从小到大累加 ($m..$n) #数组中的元素可以是表达式
perl会将其当成单引号内的字符串来处理,其中的空白字符会被抛弃,剩下的是列表元素,如 qw(fred barney betty whilma) qw! fred barney betty whilma ! qw/ fred barney betty whilma / qw# fred barney betty whilma # 如 ($fred,$barney,$dino)=("flintstone","rubble",undef); 互换变量的值 ($fred,$barney)=($barney,$fred); #交换着两个变量的值 数组的简写:在数组名之前加上@ 构建一个字符串数组: @rocks=qw/ bedrock slate lava/; @copy=@quarry; #将一个数组中的列表复制到另一个数组
pop操作符可以用来取出数组中最后一个元素,同时返回该元素值。如果数组是空的,直接返回undef。 @array=5..9; $fred =pop(@array); #$fred变成9,@array现在是(5,6,7,8) $fred=pop @array; #也可以不加括号这样写,@array现在是(5,6,7) pop @array; #@array现在是(5,6),7被抛弃了 push操作符用于添加一个元素(或是一串元素)到数组的尾端 push(@array,0); #@array现在是(5,6,0) push @array,8; #@array现在是(5,6,0,8) push @array,1..10; #@array得到了10个新元素 注意:push的第一个参数或者pop的唯一参数都必须是要操作的数组变量—对列表直接进行push或者pop操作是没有意义的。
与pop和push类似,不过是针对数组开头的元素 @array = qw[dino fred barney]; 与pop类似,对于一个空的数组变量,shift会返回undef
字符串中的数组内插: 和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组各个元素之间自动添加空格,但首尾不会增添额外空格,如 print "quartz @rocks limestone\n"; 为了避免@歧义,可以使用转义字符或用单引号字符串 $x="this is $fred[1]'s place"; 能逐项遍历列表中的值,依次迭代 foreach $rock (qw/bedrock slate lava/){ print "One rock is $rock.\n"; } Perl最喜欢用的默认变量:$_ 假如在foreach循环的开头省略控制变量,perl就会用默认变量$_ foreach (1..10){ print "I can count to $_!\n"; }
在许多情况下,当未告知perl使用哪个变量或数值时,perl就会自动使用$_ foreach (1..10){ print ; #直接打印12345678910 }
读取列表的值,并按相反的次序返回该列表 @fred = 6..10; @barney = reverse(@fred) #10,9,8,7,6 @fred = reverse @fred;
sort操作符: 读取列表的值,并根据内部的字符编码顺序进行排序(注意对数字排序可能出错,因为当字符串处理了), 如 @rocks= sort @rocks; 在perl解析表达式的时候,要么希望得到一个标量,要么希望得到一个列表 表达式所在的位置,perl期望得到什么,那就是该表达式的上下文 @back= reverse qw/yabba dabba doo/;#会变成doo,dabba,yabba $back= reverse qw/yabba dabba doo/;#会变成oodabbadabbay 很简单,如果表达式求值结果为标量值,自动产生一个仅含此标量值的列表 清空列表可以使用@betty=();注意不是undef
使用伪函数scalar,如 print "I have ", scalar @rocks,"rocks!\n"; # 此时@rocks返回数组个数
列表上下文中的<STDIN>: 返回所有剩下的行,直到文件结尾,返回的每一行都会成为列表中的某个元素 @lines=<STDIN>; 此时也可用chomp去掉每一行的换行符chomp(@lines); 更常见的是 chomp(@lines=<STDIN>);
练习: 1. 写一个程序,读入一些字符串(每行一个),直到文件结尾为止。然后,再以相反顺序输入这个列表。假如输入来自键盘,你需要在Unix系统上键入Ctrl+D或在Windows系统上键入Ctrl+Z然后回车来表示输入的结束。 print reverse <STDIN>;
2. 写一个程序,读入一些数字(每行一个),直到文件结尾为止。然后,根据每一个数字输出如下名单中相应的人名。比方说,如果输入的数字是1,、2、4和2.那么输出的人名将会是fred、betty、dino和betty my @name =(fred,betty,san,dino,ddee,erwre,werew); chomp(@array = <STDIN>); foreach(@array){ my $num=$_; my $n=$num-1; print "$name[$n]\n"; }
|
请发表评论