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确实想要一个看起来更完美的解决方案。我将把这个答案作为一个提醒,提醒你给出深思熟虑的答案,而不是半生不熟的答案。