Perl检查标量是否包含数组中的一个元素

Perl检查标量是否包含数组中的一个元素,perl,Perl,我有一个数组 my @array = qw/FOO BAR BAZ/; 以及从包含以下数据的文件中读取的标量 +++123++585+++FOO 或 +++589++458+++XYZ 我正在寻找一种很好的方法来检查数组的元素是否匹配输入字符串的一部分 我知道我可以在数组上循环并以这种方式匹配,但我想知道是否有一种更像perl的方式。您可以创建一个匹配所有@array的正则表达式: my $regex = join '|', map quotemeta, @array; $string =

我有一个数组

my @array = qw/FOO BAR BAZ/;
以及从包含以下数据的文件中读取的标量

+++123++585+++FOO

+++589++458+++XYZ
我正在寻找一种很好的方法来检查数组的元素是否匹配输入字符串的一部分


我知道我可以在数组上循环并以这种方式匹配,但我想知道是否有一种更像perl的方式。

您可以创建一个匹配所有@array的正则表达式:

my $regex = join '|', map quotemeta, @array;
$string =~ $regex;

您可以创建与所有@array匹配的正则表达式:

my $regex = join '|', map quotemeta, @array;
$string =~ $regex;

是的,有更好的办法。您可以构造正则表达式。它将是固定字符串的替代品,幸运的是将其转换为trie(Aho-Corasick),从而导致线性搜索时间。这是最有效的方法

my @array = qw/FOO BAR BAZ/;
my $re = join '|', map quotemeta, @array;
$re = qr/$re/;

for my $string (@strings) {
  if ($string =~ $re) {
    ...
  }
}

是的,有更好的办法。您可以构造正则表达式。它将是固定字符串的替代品,幸运的是将其转换为trie(Aho-Corasick),从而导致线性搜索时间。这是最有效的方法

my @array = qw/FOO BAR BAZ/;
my $re = join '|', map quotemeta, @array;
$re = qr/$re/;

for my $string (@strings) {
  if ($string =~ $re) {
    ...
  }
}
这正是我们的目的。下面是一个小片段:

use strict;
use warnings;

my $str = "+++123++585+++FOO";
my $blank = "+++123++585+++XYZ";
my @array = qw/FOO BAR BAZ/;
print grep {$str =~ $_} @array, "\n";
print grep {$blank =~ $_} @array, "\n";
这将返回:

FOO
grep
reduce
map
是我们在FP世界中所称的高阶函数,尽管
reduce
在那里可能被称为
fold
。更多信息,请查看MJD的高阶Perl

    • 这正是我们的目的。下面是一个小片段:

      use strict;
      use warnings;
      
      my $str = "+++123++585+++FOO";
      my $blank = "+++123++585+++XYZ";
      my @array = qw/FOO BAR BAZ/;
      print grep {$str =~ $_} @array, "\n";
      print grep {$blank =~ $_} @array, "\n";
      
      这将返回:

      FOO
      
      grep
      reduce
      map
      是我们在FP世界中所称的高阶函数,尽管
      reduce
      在那里可能被称为
      fold
      。更多信息,请查看MJD的高阶Perl


      正则表达式?是吗?
      do{if($str=~m/$\u/){print“yes!”;print;print“\n”}对于@array
      @loldop,OP确实说过他们更喜欢不涉及数组循环的方式。@S.R.I,谢谢,我错过了规则表达式?是吗?
      do{if($str=~m/$\u/){print“yes!”;print;print“\n”}}对于@array
      @loldop,OP确实说过他们更喜欢一种不涉及数组循环的方式。@S.R.I,谢谢你,我错过了
      grep
      map
      ,和
      reduce
      这意味着循环在这里是不必要的,虽然您对HOP的了解值得称赞。虽然我同意
      grep
      map
      reduce
      基本上都是隐藏的循环迭代,但我可以看出我的解决方案不是最优的。也就是说,OP确实想要一个看起来更完美的解决方案。我将把这个答案作为一个提醒,提醒你要给出经过深思熟虑的答案,而不是半生不熟的答案。
      grep
      map
      、和
      reduce
      意味着一个循环,这在这里是非常不必要的,尽管你对HOP的了解是值得称赞的。虽然我同意
      grep
      map
      reduce
      基本上都是循环迭代,我可以看出我的解决方案不是最优的。也就是说,OP确实想要一个看起来更完美的解决方案。我将把这个答案作为一个提醒,提醒你给出深思熟虑的答案,而不是半生不熟的答案。