设为首页 收藏本站
查看: 970|回复: 0

[经验分享] 《Perl语言入门》之二——列表与数组

[复制链接]

尚未签到

发表于 2018-8-31 07:42:52 | 显示全部楼层 |阅读模式
  列表指的是标量的有序集合,而数组则是存储列表的变量;精确的说,列表指的是数据,数组指的是变量。
  访问数组中的元素
  数组元素是以连续的整数来编号,从0开始,之后的每一个元素依次加1,例如
$fred[0] = "yabba";  
$fred[1] = "abba";
  
$fred[2] = "doo";
  数组的名字空间和变量的名字空间是完全分开的,因此可以在同一个程序里再取一个名为$fred的变量而不会冲突。
  任何求值能得到数字的表达式都可以作为下标。如果它不是整数,则会自动舍去小数,无论正负。
  特殊的数组索引
  例如,对于上例中的数组@fred,最后一个元素的索引值是$#fred。
  不过Perl为此类用法提供的更为简洁的“负数数组索引值”。上例中,$fred[-1]="doo", $fred[-2] = "abba"……
  列表直接量
  列表直接量由圆括号隔开的一串数据表示,这些数据就称为列表元素。例如
(1, 2, 3) #包含1、2、3这三个数字的列表  
(1..100) #100个整数构成的列表
  注意,范围操作符".."会从左边的数字计数到右边,每次加1;但是范围操作符只能向上计数,如果需要一个倒序的列表,可以使用reverse 操作符。
  在Perl程序里,经常需要建立简单的单词列表,这时只需要使用qw简写,就可以省去键入无谓引号的麻烦,例如:
qw( fred barney betty wilma dino )  
或者
  
qw#   #看起来像注释,不过这里用作定界符,此外还可以用!、/、[]、{}等任何标点符号作为定界符
  
fred  #可以使每个元素独立成行,便于阅读和修改
  
barney
  
betty
  
wilma
  
dino
  
#
  常用的数组操作符
  pop和push操作符,pop负责取出数组中的最后一个元素并将其返回,push将一个或多个元素添加到数组的尾端,例如
@array = 5..9;  
$fred = pop @array  #$fred变成9,@array变成(5, 6, 7, 8)
  
push @array, 9 #@array变成(5..9)
  shift和unshift操作符同上面的完全相反,处理数组开头的部分,例如
@array = qw # dino fred barney #;  
$m = shift(@array); # $m变成"dino", @array变成("fred", "barney")
  
$n = unshift(@array, "betty"); # @array变成("betty", "fred", "barney")
  splice操作符用于操作数组中间的的某些元素,它可以接受至少两个,最多四个参数,例如:
@array = qw( pebbles dino fred barney betty )  
@removed = splice @array, 3 # 删掉元素barney及其以后元素,@removed变成qw ( barney betty )
  

  
@array = qw( pebbles dino fred barney betty )
  
@removed = splice @array, 1, 2 # 从索引1开始,删掉2个元素,@array变成qw( pebbles barney betty ),@removed变成qw( dino fred )
  

  
@array = qw( pebbles dino fred barney betty )
  
@removed = splice @array, 1, 2, qw( wilma ) # @array变成qw( pebbles wilma barney betty ),@removed变成qw( dino fred )
  reverse操作符
@fred = 6..10;  
@barney = reverse @fred; # 得 10, 9, 8, 7, 6
  必须注意,reverse不会修改传进来的参数,只会返回次序相反的列表。
  sort操作符
  sort操作符会读取列表的值,而且会根据ASCII码的大小对它们进行排序。
@fred = 8..12;  
@rocks = sorts @fred # 得到10, 11, 12, 8, 9
  each操作符
  Perl 5.12版引入了each操作符,用于返回数组中下一个元素所对应的索引和值。
use 5.012;  
my @rocks = qw / bedrock slate rubble granite /;
  
while (my($index, $value) = each @rocks) {
  
say "$index: $value";
  
}
  foreach控制结构
  foreach能逐项遍历列表中的值。控制变量不是列表元素的复制品,它就是列表元素本身。(我想Perl内部应该是用指向列表的指针实现的控制变量)
  加入在foreach循环开头省略控制变量,Perl就会用它最喜欢的默认变量"$_",在许多情况下,当未告知Perl使用哪个变量或数值时,Perl都会自动使用"$_"。
  标量上下文与列表上下文
  如同自然语言,Perl的同一个表达式出现在不同的地方会有不用的意义。
  对于数组来说,在列表上下文中,它会返回元素的列表;在标量上下文中,则返回数组中元素的个数:
@people = qw (fred barney betty)  
@sorted = sort @people # 列表上下文:barney, betty, fred
  
$number = 42 + @people # 标量上下文:42 + 3 = 45
  当然,并不是一定会在标量上下文中得到列表的个数。比如sort在标量上下文中会返回undef。(实际上没人需要统计列表排序后的元素个数)
  reverse是一个更加有趣的例子:
@backwords = reverse qw/ yabba dabba doo /; #会得到 doo,dabba,yabba  
$backwords = reverse qw/ yabba dabba doo /; #会得到oodabbadabbay
  相对于上面的用法,在列表上下文中使用产生标量的表达式就简单很多了:如果表达式求值结果为标量值,则自动产生一个仅含此标量值的列表。
@fred = 6 * 7; # 得到仅有一个元素的列表(42)  强制指定标量的上下文
  可以使用伪函数"scalar"从列表上下文切换到标量上下文:
@rocks = qw( talc quartz jade obsidian );  
print "I have", scalar @rocks, "rocks!\n"; #打印出的是石头的种数
  列表上下文中的
  在标量上下文中,会返回输入数据的下一行;在列表上下文中,会返回所有剩下的行,直到文件结束为止,返回的每一行都会成为列表中的元素。
  当输入数据来自某个文件时,列表上下文会读取文件的剩余部分。如果是键盘输入:Unix或类似系统可以键入"Control+D"来告知系统不会有任何输入了;对于Windows来说,需要使用"Control+Z"。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559076-1-1.html 上篇帖子: 《Perl语言入门》之一——标量数据 下篇帖子: perl插入文本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表