perl第三章 列表和数组

访问数组中的元素 $fred[0] $fred[1]

$number=2.75;

print $fred[$number-1] 结果就是print $fred[1]

特殊的数组索引1.对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大

2.对最后一个元素索引值 例如数组名围rocks 则最后一个索引值为 $#rocks

列表直接量

list literal (1,2,3)包含1,2,3,这三个数字的列表

(1..5)表示 1-5五个数字

($m,17)

qw简写 省略引号

qw(fred barney betty wilma dino) 列表

列表的赋值 ($fred,$barney,$dino)=("flintstone","rubble","undef");

当变量的个数多个给的哪个的列表值得个数,那么多出来的变量会被设置为undef

例子:($a[0],$a[1],$a[2])=qw/talc mica/;

引用整个数组 在数组名前加上@符号即可 后边不加索引值 例如@rack 代表所有的rack

可用于赋值操作 @rack=qw/bedrock slate lava/;

将一个数组中的列表复制到另一个数组 @copy=@quary

pop和push操作符 栈的操作 新增元素到数组尾端,存放到更高的索引值的新位置即可

pop用于去除数组中的最后一个元素;

例子: @array=5..9;

$f=pop(@array);#$f的值为9,而@array现在是(5,6,7,8);

也可取消掉括号 pop @array

push 用于添加一个元素或是一串元素 到数组的尾端

push(@array,0);最后一个元素是0

shift和unshift操作符

pop和push都是从数组右边开始弹出和压入

shift和ushift是从左边开始弹出和压入

@array=qw #dino fred barney#;

$m=shift(@array);

//$m值为dino array数组为(fred barney)

unshift(@array,5);@array现在是只有一个元素的列表(5)

splice操作符

push-pop和shift-unshift均是针对数组首位操作的。如果希望添加或移除数组中间的某些元素,需要用到splice操作符。

splice 目标数组,操作的开始位置,[3参],[4参];

例子:@array=qw(p d f b b);

@removed=splice @array,2;//@array=(p d);

//@removed=(f b b);

3参指定要操作的元素长度,代表要操作的元素个数,可以删除掉数组中间的一个片段;

@array=qw(p d f b a);

@removed=splice @array,1,2;

//@removed=qw(d f);@array=qw(p b a);

4参是要替换的列表 3参设为0 即可不删除地插入新列表;

@array=qw(p d f b a);

@removed=splice @array,1,0,qw(w);

// @removed变为qw() @array变为qw(p w d f b a);

字符串中的数组内插

例子: @rocks为列表数组

print “quartz @rocks limestone \n”;

注意邮件中的@符号 插入的是数组 而非@地址

$fred[3] 为数组 ;${fred}[3]为变量 $fred的值

foreach控制结构

例子:foreach $rock(qw/ b s l /)

{

print "one rock is $rock.\n";

}

在循环中修改了控制变量的值,也同时修改了这个列表元素本身

@rocks= qw/b s l/;

foreach $rock($rocks)

{ $rock="\t$rock";//在@rocks的每个元素前加上制表符

$rock.="\n";//同时在末尾加上换行符

}

print "the rocks are:\n",@rocks;各自占一行,并使用缩排

当循环结束后,控制变量的值仍然是循环执行之前的值,perl会自动保存foreach循环的控制变量并在循环结束之后还原,在循环执行期间,我们无法访问改变已经存储的值,所以当循环结束时,变量仍然保持循环前的值,如果它之前从未被赋值,那就仍然是undef;

$rock="shale";

@rocks=qw /bedrock slate lava/;

foreach $rock(@rocks){

..

}

print "rock is still $rock\n"; //结果为shale

perl最喜欢用的默认变量:$_

省略上例中的$rock 用perl默认的变量$_

foreach (1..10){

print "i can count to $_!\n";

}

例2:$_="fuck you";

print; //默认打印$_的值

reverse操作符

读取列表或数组的值,并安装相反的次序返回该列表。

例子:@fred=6..10;

@barney=reverse(@fred);#得到10,9,8,7,6

注意 reverse会返回次序相反的列表,但是他不会修改传进来的参数。

例:reverse @fred;#不会修改@fred的值

sort操作符

读取列表的值,会根据内部的字符编码顺序对他们进行排序。

按照字符在计算机内部表示的代码点排序。

例子:@rocks=qw/b s r g/;

@sorted=sort(@rocks);

#得到的结果为b g r s

注意数字当做字符串排序会和期望值有出入

each操作符

对数组调用each会返回数组中下一个元素对应的两个值 该元素的索引以及该元素的值

例子1:use 5.012;#perl版本

my @rocks=qw /b s r g /;

while(my($index,$value)=each @rocks ){

say "$index:$value";

}

例子2:根据索引从小到大一次遍历,借助索引值取得元素的值:

@rocks=qw/b s r g /;

foreach $index(0..$#rocks){

print "$index:$rocks[$index]\n";

}

例子1,2实现的功能相同

******标量上下文与列表上下文*****非常重要

本节非常重要 同一个表达式出现在不同的地方会有不同的意义。

perl期望得到什么,那就是该表达式的上下文