• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

《Beginning Perl》读书笔记2:4~5章

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

列表

  • ():空列表,当做条件判断时为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并不能影响哈希中的值


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
PERL的资源不完全索引收藏发布时间:2022-07-22
下一篇:
Perl的debug小技巧发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap