1 @unique= grep {++$count{$_}<2}
2 qw(a b a c d d e f g f h h);
3 print"@unique\n";
上述code运行后会返回:a b c d e f g h
即qw(a b a c d d e f g f h h)这个列表里的唯一元素被返回了。为什么会这样呀?让我们看看:
%count是个hash结构,它的key是遍历qw()列表时,逐个抽取的列表元素。++$count{$_}表示$_对应的hash值自增。在这个比
较上下文里,++$count{$_}与$count{$_}++的意义是不一样的哦,前者表示在比较之前,就将自身值自增1;后者表示在比较之后,才将
自身值自增1。所以,++$count{$_} < 2
表示将$count{$_}加1,然后与2进行比较。$count{$_}值默认是undef或0。所以当某个元素a第一次被当作hash的关键字时,它
自增后对应的hash值就是1,当它第二次当作hash关键字时,对应的hash值就变成2了。变成2后,就不满足比较条件了,所以a不会第2次出现。
所以上述code就能从列表里唯一1次的抽取元素了。 2. 抽取列表里精确出现2次的元素
glob返回一个列表,它的内容是当前目录里的任何文件,除了以’.'开头的。{}是个code块,它包含了匹配它后面的列表的条件。这只是 grep的另一种用法,其实与 grep EXPR,LIST 这种用法差不多了。-f and -T 匹配列表里的元素,首先它必须是个普通文件,接着它必须是个文本文件。据说这样写效率高点哦,因为-T开销更大,所以在判断-T前,先判断-f了。 4. 选择数组元素并消除重复
1 @array= qw(To be ornot to be that is the question);
2 @found_words=
3 grep { $_ =~/b|o/i and++$counts{$_}<2;}@array;
4 print"@found_words\n";
5
运行结果是:To be or not to question
{}里的意思就是,对@array里的每个元素,先匹配它是否包含b或o字符(不分大小写),然后每个元素出现的次数,必须小于2(也就是1次啦)。
grep返回一个列表,包含了@array里满足上述2个条件的元素。 5. 从二维数组里选择元素,并且x<y
1 # An array of references to anonymous arrays
2 @data_points=([5,12],[20,-3],
3 [2,2],[13,20]);
4 @y_gt_x= grep { $_->;[0]< $_->;[1]}@data_points;
5 foreach $xy (@y_gt_x){print"$xy->;[0], $xy->;[1]\n"}