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

[经验分享] 《Beginning Perl》读书笔记2:4~5章

[复制链接]

尚未签到

发表于 2015-12-26 16:55:02 | 显示全部楼层 |阅读模式
第4章:列表与数组

列表


  • ():空列表,当做条件判断时为false
  • 两个非空列表示例:("Hello ", "world", "\n") (123, 456, 789)
  • 同一列表中可以容纳不同类型的元素
  • Perl中的列表只有一维。(3, 8, 5, 15)、((3, 8), (5, 15))和(3, (8, 5), 15)都等于(3, 8, 5, 15)
  • qw//可以用来声明字符串数组:qw/hello world good bye/等于('hello', 'world', 'good', 'bye'). 这里有两个要点:1. 元素以空格分隔 2. 空格分隔开的字符串被当做单引号声明的字符串处理。同样可以用#、|、<>、[]、{}、()代替//
  • 可以对整数定义区间:(1 .. 6)等价于(1, 2, 3, 4, 5, 6). 注意只能对整数定义。如果对小数定义则会导致整数截断:(1.4 .. 6.9)等价于(1, 2, 3, 4, 5, 6). 由于字符也是整数,因此形如('a'..'k')的写法也可以
  • reverse()函数将列表反序,例如reverse (qw(The cat sat on the mat))等于qw(mat the on sat cat The)
  • list[index]用于取列表中的元素。下标从0开始。负的下标表示倒序下标,例如list[-1]指最后一个元素,而list[-2]指倒数第二个元素。

    • (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[-2..1])等于(‘Nov’, ‘Dec’, ‘Jan’, ‘Feb’)

  • 使用多个下标可以将列表切片:(19, 68, 47, 60, 53, 51, 58, 55, 47)[(4, 5, 6)]将得到(53, 51, 58)

    • 也可写作(19, 68, 47, 60, 53, 51, 58, 55, 47)[4, 5, 6]

  • 列表赋值:($mone, $mtwo) = (1, 3);等价于$mone=1;$mtwo=3;

    • ($mone, $mtwo) = ($mtwo, $mone);

  • 可以将多个下标和区间获取切片:(qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[0,3,7..11])

数组


  • Perl中存有列表的变量称为数组,数组名以@开头,例如@array = (1,2,3);
  • print函数接受的参数本质上就是一个列表,所以可以直接将数组打印出来:

@array = (4, 6, 3, 9, 12, 10);
print @array, "\n";
得到:46391210
而如果使用这种写法
print "@array\n";
得到自动按空格分隔好的列表:4 6 3 9 12 10


  • 将列表强制转换为标量将会得到列表的长度(所含元素数)

    • $scalar1 = @array1;
    • 或使用scalar()函数:print scalar @array1;

  • 向数组中添加元素:



my @array1 = (1, 2, 3);
my @array2;
@array2 = (@array1, 4, 5, 6);
@array2 = (3, 5, 7, 9);
@array2 = (1, @array2, 11);

  • $#array获取array的最大下标,例如my @array = (2, 4, 6, 8);则$#array为3
  • 可以用foreach遍历列表和数组foreach scalar_variable ( list_or_array ) {...} 其中scalar_variable为迭代器。迭代过程中,可以通过膝盖迭代器的值更新列表中的元素:my @array = (10, 20, 30, 40); foreach (@array) {$_ *=2;}执行后@array中每个元组增倍。上面给出的例子还说明如果不显式指定迭代器名字,则$_为迭代器
  • foreach也具有和if类似的expression modifier用法:print "[$_]\n" foreach @a;
  • push(@array, $scalar)将标量$scalar加到@array最后(等价于@array = (@array, $scalar)),push(@array1, @array2)则将@array2接到@array1后(等价于@array1 = (@array1, @array2))
  • pop(@array)从@array中删去最后一个元素,并返回这个元素
  • 与push类似,shift(@array, $scalar)等价于@array = ($scalar, @array);而shift(@array1, @array2)则等价于@array1 = (@array2, @array1)
  • unshift(@array)从@array中删除第一个元素,并返回这个元素
  • sort(@array)将@array进行排序,默认排序方法是字母排序。而如果希望数值排序,则可以调用sort({comparator}, @array),并定义数值排序规则,例如:my @number = sort { $a <=> $b } @unsorted;为进行数值排序,而my @string = sort { $a cmp $b } @unsorted;为进行字母排序
  • exists(@array[index])如果存在元素@array[index]则为true,否则false
  • delete(@array[index])删除@array中下标为index的元素,注意:如果删除的不是数组中的最后一个元素,则该被删除元素位置仍保留(即数组的长度不变),该位置上为一未初始化值的变量。如果删除的是最后一个元素,则数组的长度将会减1.

第5章:哈希


  • Perl里的哈希指的是哈希映射,即类似stl::hash_map、java.util.HashMap
  • 哈希变量声明、初始化时以%开始,例如:

    • %where = ("Gary" , "Dallas","Lucy" , "Exeter","Ian" , "Reading","Samantha" , "Portland");基于这种写法可以通过列表初始化哈希:@array = qw(Gary Dallas Lucy Exeter Ian Reading Samantha Portland);%where = @array;
    • 也可以写作%where = (Gary => "Dallas",Lucy => "Exeter",Ian => "Reading",Samantha => "Portland");
    • 但在使用时仍然以$开始,例如取值$where{Gary},$where{“Ian”}

  • 通过复制运算可以修改哈希中保存的值,也可以添加新值:$where{$key}=$value如果$key已存在,则将$key对应的值更新为$value,否则将$key=>$value对加入哈希
  • exists()可用于检查某个键在哈希中是否存在,如果存在为true否则false. 例如:exists $where{Gary}
  • delete()可用于删除哈希中的值,例如delete $hash{$key}
  • 将哈希转换为列表:按哈希中的key=>value对逐个列出,即(key1, value1, key2, value2 ...).

    • 通过将哈希赋值给列表变量,可以将哈希列表化:my %hash=(....); my @list=%hash;
    • 在print中使用哈希%hash也会被强转,因为print接受的是列表类型

  • 将哈希转换为标量,将得到一个分数,分子是哈希表中已经使用的桶,分母是总共桶数my $scalar = %person;print "$scalar\n"; #输出3/8
  • keys($hash)返回$hash中所有key的列表,values($hash)返回$hash中所有值的列表。注意既然为列表,那么values($hash)中可能存在重复值
  • 可以用each()函数遍历哈希表中所有key=>value对。



my %where = (
Gary => "Dallas",
Lucy => "Exeter",
Ian => "Reading",
Samantha => "Portland"
);
my($k, $v);
while (($k, $v) = each %where) {
print "$k lives in $v\n";
}
      注意由于($k, $v)的值是拷贝赋值,因此改变$k/$v并不能影响哈希中的值

运维网声明 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-156720-1-1.html 上篇帖子: Perl eval函数探讨 下篇帖子: Perl 编程系列
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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