【问题标题】:How do I tell perl's grep that it shall use the given string literally?我如何告诉 perl 的 grep 它应该按字面意思使用给定的字符串?
【发布时间】:2014-05-29 22:58:18
【问题描述】:

我想检查一个 perl 数组是否提供了某个值。

How can I check if a Perl array contains a particular value? 告诉我可以使用grep( /^$value$/, @array ) 来检查$value 是否已包含在@array 中。

只要$value 没有特殊字符,它就可以工作。不幸的是,我的数组元素是 Visual Studio 项目的路径,看起来像 $(MY_USER_MACRO)/includes/myfile.h 对于这些元素,grep( /^$value$/, @array ) 总是返回 false,尽管 @array 中已经存在许多这样的条目。

我认为问题的发生是因为$value 中包含$ 字符,因此以某种方式中断了grep 的执行。

有没有办法告诉grep 从字面上理解给定的字符串?如果不是:那我该如何解决我的问题?

【问题讨论】:

  • perldoc -f quotemeta
  • @devnull: perldoc -f grep

标签: arrays regex perl grep


【解决方案1】:

引用你的正则表达式:

grep( /^\Q$value\E$/, @array )

你也可以这样做,因为你正在测试平等:

grep( $_ eq $value, @array )

【讨论】:

  • 使用\Q 告诉// 运算符,而不是grep$value 视为正则表达式(或者更准确地说,将其转换为匹配$value 的正则表达式字面上地)。但grep 的第一个参数可以是任意块或表达式,而不仅仅是正则表达式匹配。
  • 使用grep { $_ eq $value} @array,我很高兴。谢谢。
  • @KeithThompson:我无法从你的评论中读到任何对我有帮助的东西。你会怎么做? perldoc.perl.org/functions/grep.html 是我见过的最糟糕的文档之一...
  • @eckes:我的评论究竟让你感到困惑的是什么? (如果这是你见过的最糟糕的文件之一,那你已经非常幸运了。)
  • 请注意,这两者并不完全等同。第一个将匹配$value$value\n,而第二个将仅匹配$value。第二个相当于/^\Q$value\E\z/
【解决方案2】:

grep { index($_, $value) >= 0} @array;

perldoc -f 索引

索引 STR,SUBSTR,POSITION
索引 STR,SUBSTR
index 函数在另一个字符串中搜索一个字符串,但没有完整正则表达式模式匹配的类似通配符的行为。它 返回 STR 在 POSITION 处或之后第一次出现 SUBSTR 的位置。如果省略 POSITION,则从开头开始搜索 字符串。字符串开头之前或结尾之后的 POSITION 分别被视为开头或结尾。位置 并且返回值基于 0(或您将 $[ 变量设置为的任何值——但不要这样做)。如果未找到子字符串,则返回“index” 比底数小一,通常是“-1”。

【讨论】:

    【解决方案3】:

    上述问题的另一种解决方案是,如果您只关心是否存在至少一个匹配值,而不关心其中有多少,则可以使用 List::Util 中的 any 函数.

    use List::Util 'any';
    
    if( any { $_ eq $value } @array ) {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多