代码之家  ›  专栏  ›  技术社区  ›  Lydon Ch

perl的grep函数如何与regex一起工作?

  •  3
  • Lydon Ch  · 技术社区  · 15 年前

    下面的grep函数是如何工作的? !/0o1Iil]/ 是吗?)

    @chars = grep !/0o1Iil]/, 0..9, "A".."Z", "a".."z"; 
    use Data::Dumper; 
    print Dumper @chars;
    

    在@chars中生成以下内容?

    $VAR1 = 0;
    $VAR2 = 1;
    $VAR3 = 2;
    $VAR4 = 3;
    $VAR5 = 4;
    $VAR6 = 5;
    $VAR7 = 6;
    $VAR8 = 7;
    $VAR9 = 8;
    $VAR10 = 9;
    $VAR11 = 'A';
    $VAR12 = 'B';
    $VAR13 = 'C';
    $VAR14 = 'D';
    $VAR15 = 'E';
    $VAR16 = 'F';
    $VAR17 = 'G';
    $VAR18 = 'H';
    $VAR19 = 'I';
    $VAR20 = 'J';
    $VAR21 = 'K';
    $VAR22 = 'L';
    $VAR23 = 'M';
    $VAR24 = 'N';
    $VAR25 = 'O';
    $VAR26 = 'P';
    $VAR27 = 'Q';
    $VAR28 = 'R';
    $VAR29 = 'S';
    $VAR30 = 'T';
    $VAR31 = 'U';
    $VAR32 = 'V';
    $VAR33 = 'W';
    $VAR34 = 'X';
    $VAR35 = 'Y';
    $VAR36 = 'Z';
    $VAR37 = 'a';
    $VAR38 = 'b';
    $VAR39 = 'c';
    $VAR40 = 'd';
    $VAR41 = 'e';
    $VAR42 = 'f';
    $VAR43 = 'g';
    $VAR44 = 'h';
    $VAR45 = 'i';
    $VAR46 = 'j';
    $VAR47 = 'k';
    $VAR48 = 'l';
    $VAR49 = 'm';
    $VAR50 = 'n';
    $VAR51 = 'o';
    $VAR52 = 'p';
    $VAR53 = 'q';
    $VAR54 = 'r';
    $VAR55 = 's';
    $VAR56 = 't';
    $VAR57 = 'u';
    $VAR58 = 'v';
    $VAR59 = 'w';
     $VAR60 = 'x';
     $VAR61 = 'y';
     $VAR62 = 'z';
    
    4 回复  |  直到 15 年前
        1
  •  6
  •   rjh    15 年前

    这里是 grep perldoc . 示例中的语句使用 grep EXPR,LIST 语法,这意味着任何Perl表达式都可以代替 EXPR .

    grep获取提供给它的列表,只返回expr为true的项。

    本例中的expr是 ! /0o1Iil]/ (为可读性增加空间)表示“此项 与regex匹配 /0o1Iil]/ . 因为这些项都不与正则表达式匹配(它们都不包含字符串 0o1Iil] )他们都回来了。

    正如其他海报所提到的,regex可能应该读 /[0o1Iil]/ ,这将删除可能混淆的字符,例如0和O、1和I。这听起来对密码或序列号等很有用。

    顺便说一句,您可以将grep重写为更清晰的块格式,并使列表结构显式:

    @chars = grep { ! /[0o1Iil]/ } (0..9, 'A'..'Z', 'a'..'z');
    
        2
  •  2
  •   zoul    15 年前

    // 是正则表达式匹配运算符。 !/[0o1Iil]/ 表示与方括号中的任何字符都不匹配。我想你少了一个方括号( [ )在第一个斜杠之后,目的是过滤掉所有可能被误认为其他字符的字符(0/o,i/l/1)。

        3
  •  1
  •   codaddict    15 年前

    perl grep的一般语法是:

    grep BLOCK LIST
    

    它评估 BLOCK 对于的每个元素 LIST 并返回由表达式计算为true的元素组成的列表值。

    以你为例 街区 !/0o1Iil]/ 对于那些不包含模式的元素返回true 0o1Iil] . 因为在你的情况下 元素包含该模式,grep返回整个 .

    街区 就像: !/[0o1Iil]/ 对于那些 不包含零、小写O、1、I、I或L ,那么你会得到一个 结果除了这些元素。

        4
  •  0
  •   Zaid    15 年前

    这个 grep 函数用作列表上的筛选器。

    在这种情况下,列表都是字母数字字符。

    筛选器由正则表达式指定。这个 ! 表示 not . 换句话说,结果列表应该排除与正则表达式匹配的任何项。

    正则表达式试图匹配 0o1Iil] (不是) 0o1Iil ,因为省略了 [ 在集合的开头将阻止正则表达式看到 ] 作为 字符类 元字符。

    grep {not /0o1Iil]/} 0..9, A..Z, a..z (没有 [ ):

    看到名单 0..9, A..Z, a..z 不包含 01IIL ,没有要筛选的项,这就是为什么您要返回整个字母数字字符列表。

    grep {not /[0o1Iil]/} 0..9, A..Z, a..z (与 [ ):

    列表中的任何匹配项 0 , o , 1 , I , i l 会被过滤掉。因此,您将得到您的字母数字列表,没有上述六个字符。