加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl笔记:第02章、列表与数组

发布时间:2020-12-16 00:07:32 所属栏目:大数据 来源:网络整理
导读:列表(list): 列表指的是标量的有序集合。 数组(array): 是存储列表的变量 列表指的是数据,而数组指的是变量。列表的值不一定放在数组里,但每个数组变量都一定包含一个列表(即使该列表可能是空的)。如下图是一个列表,无论他是否存储在某个数组中: 包含5

列表(list):列表指的是标量的有序集合。
数组(array):是存储列表的变量

列表指的是数据,而数组指的是变量。列表的值不一定放在数组里,但每个数组变量都一定包含一个列表(即使该列表可能是空的)。如下图是一个列表,无论他是否存储在某个数组中:

包含5个元素的列表
数组或列表中的每个元素(element)都是单独的标量变量,拥有独立的标量值。这些值是有序的,也就是说,从起始元素到终止元素的先后次序是固定的。数组或列表中的每个值都有其索引值。

特殊的数组索引值

如何确定数组最后一个索引号是多少
$rocks[0]='a' # 一个元素
$rocks[1]='b' # 第二个
$rocks[2]='c'
$rocks[3]='d'
$rocks[99]='end' # 现在有95个undef 元素

那么 $#rocks 的值为99 因为$rocks索引的最后一个索引确实为99,数组中元素的个数为$#rocks+1 。
下面的方法是获得数组最后一个元素的值
print $rocks[-1]

列表直接量

在圆括号中用逗号隔开的一系列值,这些值构成了列表中的元素。如下:
(1,2,3) # 包含1、2、3这三个数字的列表
(1,3,) # 相同的三个数字,末尾的逗号忽略掉了
("fred",4.5) # 两个元素 fred和4.5
() # 空列表;零个元素
(1..100) # 100个整数构成的列表

上面最后一个例子用到了范围操作符(..)。该操作符会冲左边的数字技术到右边,每次加1,以产生一连串的数字。举例来说:
(1..5) # 含有1、2、3、4、5
(1.7..5.7) # 同上,小数部分舍去
(5..1) # 空列表,仅向上计数
(0,2..6,10,12) # 含有0、2、3、4、5、6、10、12
($m..$n) # 范围由$m和$n当前的值决定
(0..$#rocks) # rocks数组里的所有索引数字

正如最后两行所示,列表中的元素不必都是常量——他们也可以是表达式,每次用到这个表达式就会重新计算。

qw简写

在perl程序中经常需要建立简单的单词列表。这时使用qw简写,就不必键入许多无用的引号:
qw( fred barney betty willma dino ) # 更简洁

当然qw还可以使用任意的符号作为列表的定界符,如下
qw! fred barney betty willma dino !
qw/ fred barney betty willma dino /
qw# fred barney betty willma dino #
qw( fred barney betty willma dino )
qw{ fred barney betty willma dino }
qw[ fred barney betty willma dino ]
qw< fred barney betty willma dino >

最后四行所示,与前面的三个略有不同,如果起始定界符是偶中“左”字符,则结尾的定界符就是相应的“右”字符。如果是其他符号则前后定界符必须相同。

如果qw中需要有定界符的出现,可以使用反斜线转义一下,如下:
qw! fred barney !betty willma dino !

下面的例子是保护一连串unix文件名的列表:
qw{
/
usr
/
dict
/
words
/
home
/
rootbeer
/
install
}

列表的赋值

($fred,$barney,$dino)=("a","b",undef); # 相当于做了3次独立的赋值操作
($fred,$barney)=($barney,$fred); # 互换两者的值
($fred,$barney)=qw< a b c d e> # 丢弃c、d、e
($fred,$barney)=qw< a > # $barney被赋值为undef

pop和push操作符

pop操作符可以去除数组中最后一个元素,同时返回该元素值:
@array=5..9;
#fred=pop(@array); $ $fred 变为9 @array 现在是(5,6,7,8)
$barney=pop @array; $ $barney 为8 @array 现在是(5,7)
pop @array; $ @array 为(5,6) 7被丢弃了

如果数组是空的,那么执行pop操作的话会返回undef

与pop对应的是push操作符
push (@array,0); # @array 为(5,0)
push @array,8; # @array 为(5,8)
push @array,1..10; # @array 得到了10个新元素
@others=qw/ 9 0 2 1 0 /;
push @array,@others; # @array 又得到了5个新元素(共19个)

注意:push的第一个参数或pop的那个唯一的参数必须是数组变量

shift和unshift操作符

pop和push都是针对数组的最后一个元素进行操作,那么shift和unshift则是针对数组的最前面的元素进行操作

@array=qw# dino fred barney #;
$m=shift(@array); # @m 变为 dino,@array 现在是fred,barney
$n=shift @array; # @n 变为 fred,@array 现在是barney
shift @array; # 现在@array 为空了
$o=shift @array; # $o为undef @array 还是为空
unshift(@array,5); # @array为5
unshift @array,4; # @array为4,5
@others=1..3;
unshift @array,@others; # @array为1,2,3,4,5

字符串中的数组内插

和标量一样,数组也可以放在双引号包含的字符串中。如果将数组直接书写到双引号包含的字符串中时,会在数组的各个元素之间添加空格:

#!/usr/bin/perl -w</span></span>

use strict ;

my @fruit = qw/apple banana orange pear/ ;

print "my fruit :@fruitn" ;
print "I like:$fruit[0]n" ;

输出结果:
my fruit :apple banana orange pear
I like:apple

注意:
1、如果在我的数组后面还有其他字符时,需要将数组用括号括起来,如:print "my likes (@fruit) and some thing!";
2、如果我要在print语句中使用电子邮箱该如何书写呢?直接将@字符转义既可,如 print "zyqduron@163.com";

foreach控制结构

foreach循环可以逐项遍历列表中的只,一次迭代(循环过程):
foreach $rock (qw/ bedrock slate lava /)
{
print "one rock is $rock.n" # 依次打印所有三种石头的名称
}

每次循环时,控制变量(control variable)(即此例中的$rock)都会从列表中取得新的值

控制变量并不是列表元素的复制品——实际上,他就是列表元素本身。也就是说,加入在循环中修改了控制变量的值,也就同时修改了这个列表元素。如下列子:

#!/usr/bin/perl -w
@rocks = qw/ bedrock slate lava / ;
foreach $rock ( @rocks )
{
$rock = "t$rock" ;
$rock .= "n" ;
}
print "The rocks are:n" , @rocks ;

输出结果
The rocks are:
bedrock
slate
lava

注意:如果在foreach循环的靠头省略了控制变量的话,perl会使用默认的变量$_ 来取代。这个变量除了名称特别外语其他变量没有区别如下例子:

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

这种场合很多,如print,如果没有指定任何内容时他打印输出的为$_ 变量中的内容

reverse操作符

reverse可以反转列表或数组的值,如下:
@fred = 6..10;
@barney = reverse(@fred); # 得10,9,8,7,6
@wilma = reverse 6..10; # 同上,但不需要额外的数组
@fred = reverse @fred; # 恢复

reverse @fred; # 错误,不会修改 @fred
@fred = reverse @fred; # 这样才对

sort操作符

@rocks = qw/ bedrock slate rubble granite /;
@sorted = sort(@rocks); # 会得到bedrock,granite,rubble,slate
@back = reverse sort @rocks; # 逆序重 slate 到 bedrock
@rocks = sort @rocks; # 将排序后的结果存回 @rocks
@numbers = sort 97..102; # 得到 100,101,102,97,98,99

最后一个例子可以看出,将数字当成字符串来排序,这样的结果不太对。根据默认的排序规则,任何以1开头的字符串会被排在9开头的字符串之前。另外,它和reverse一样不会修改参数,所以要对数组排序时,你必须将排序后的结果存回数组:

sort @rocks; # 错误,这么做不会修改 @rocks @rocks = sort @rocks; # 现在手机来的石头拍的井井有条

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读