zoukankan      html  css  js  c++  java
  • grep

    几个Perl grep函数的示例

    1.统计匹配表达式的列表元素个数

    $num_apple=grep/^apple$/i,@fruits;

    在标量上下文里,grep返回匹配中的元素个数;在列表上下文里,grep返回匹配中的元素的一个列表。

    所以,上述code返回apple单词在@fruits数组中存在的个数。因为$num_apple是个标量,它强迫grep结果位于标量上下文里。

    2.从列表里抽取唯一元素

    1. @unique=grep{++$count{$_}<2}
    2. qw(abacddefgfhh);
    3. print"@unique\n";

    上述code运行后会返回:abcdefgh 即qw(abacddefgfhh)这个列表里的唯一元素被返回了。为什么会这样呀?让我们看看:

    %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次的元素

    1. @crops=qw(my love is china my wife li shan love);
    2. @duplicates=grep{$count{$_}==2} grep{++$count{$_}>;1}@crops;
    3. print"@duplicates\n";

    运行结果是:my

    这里grep了2次哦,顺序是从右至左。首先grep{++$count{$_}>;1}@crops;返回一个列表,列表的结果是@crops里出现次数大于1的元素。 然后再对产生的临时列表进行grep{$count{$_}==2}计算,这里的意思你也该明白了,就是临时列表里,元素出现次数等于2的被返回。

    所以上述code就返回rice了,rice出现次数大于1,并且精确等于2,明白了吧?:-)

    3.在当前目录里列出文本文件

    1. @files=grep{-fand-T}glob'*.*';
    2. print"@filesn";

    这个就很容易理解哦。glob返回一个列表,它的内容是当前目录里的任何文件,除了以'.'开头的。{}是个code块,它包含了匹配它后面的列表的条件。这只是grep的另一种用法,其实与grepEXPR,LIST这种用法差不多了。-fand-T匹配列表里的元素,首先它必须是个普通文件,接着它必须是个文本文件。据说这样写效率高点哦,因为-T开销更大,所以在判断-T前,先判断-f了。

    4.选择数组元素并消除重复

    1. @array=qw(To be or not to be that is the question);
    2. @found_words= grep{$_=~/b|o/i  and++$counts{$_}<2;}@array;
    3. print"@found_words\n";

    运行结果是:To be or not to question

    {}里的意思就是,对@array里的每个元素,先匹配它是否包含b或o字符(不分大小写),然后每个元素出现的次数,必须小于2(也就是1次啦)。 grep返回一个列表,包含了@array里满足上述2个条件的元素。

    5.从二维数组里选择元素,并且x

    1. #Anarrayofreferencestoanonymousarrays
    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"}

    运行结果是: 5,12 13,20

    这里,你应该理解匿名数组哦,[]是个匿名数组,它实际上是个数组的引用(类似于C里面的指针)。 @data_points的元素就是匿名数组。例如:

    foreach(@data_points){ print$_->;[0];}

    这样访问到匿名数组里的第1个元素,把0替换成1就是第2个元素了。

  • 相关阅读:
    laravel 同数据表字段比较查询和状态不正规排序
    laravel 集合
    laravel使用when搜索遇到状态参数(有0的状态)的坑
    laravel 列表搜索查询(when,with用法以及关联图像id处理图像路径)
    laravel 容器注入的坑
    PHP按符号截取字符串的指定部分
    php实现备份数据库
    数据类型 类型检测
    sublime
    vue 使用过程中自己遇到的bug
  • 原文地址:https://www.cnblogs.com/blueicely/p/2816471.html
Copyright © 2011-2022 走看看