在Perl中搜索匹配字符串的字符串数组的最智能方法是什么?
有一点需要注意,我希望搜索不区分大小写
因此"aAa"
位于("aaa","bbb")
答案 0 :(得分:141)
这取决于您希望搜索的内容:
如果您想找到所有匹配,请使用内置的grep:
my @matches = grep { /pattern/ } @list_of_strings;
如果您想找到第一次匹配,请在List::Util中使用first
:
use List::Util 'first';
my $match = first { /pattern/ } @list_of_strings;
如果您想找到所有匹配的计数,请在List::MoreUtils中使用true
:
use List::MoreUtils 'true';
my $count = true { /pattern/ } @list_of_strings;
如果您想知道第一场比赛的索引,请在List::MoreUtils中使用first_index
:
use List::MoreUtils 'first_index';
my $index = first_index { /pattern/ } @list_of_strings;
如果您只想知道是否匹配,但您不关心它是哪个元素或其值,请在{{3}中使用any
}:
use List::Util 1.33 'any';
my $match_found = any { /pattern/ } @list_of_strings;
所有这些示例的核心都是类似的东西,但是它们的实现经过了大量优化,速度很快,并且比使用List::Util grep编写的任何纯perl实现更快。 }或map。
请注意,执行循环的算法与执行单个匹配的问题不同。要匹配不区分大小写的字符串,您只需在模式中使用i
标志:/pattern/i
。如果你之前没有这样做,你一定要仔细阅读for loop。
答案 1 :(得分:29)
Perl 5.10+包含'smart-match'运算符~~
,如果某个元素包含在数组或散列中,则返回true;如果不包含,则返回false(参见perlfaq4) :
好处是它还支持正则表达式,这意味着您可以轻松地处理不区分大小写的要求:
use strict;
use warnings;
use 5.010;
my @array = qw/aaa bbb/;
my $wanted = 'aAa';
say "'$wanted' matches!" if /$wanted/i ~~ @array; # Prints "'aAa' matches!"
答案 2 :(得分:27)
我想
@foo = ("aAa", "bbb");
@bar = grep(/^aaa/i, @foo);
print join ",",@bar;
会做到这一点。
答案 3 :(得分:6)
如果您要对数组执行许多搜索, AND 匹配始终定义为字符串等效,那么您可以规范化数据并使用散列。
my @strings = qw( aAa Bbb cCC DDD eee );
my %string_lut;
# Init via slice:
@string_lut{ map uc, @strings } = ();
# or use a for loop:
# for my $string ( @strings ) {
# $string_lut{ uc($string) } = undef;
# }
#Look for a string:
my $search = 'AAa';
print "'$string' ",
( exists $string_lut{ uc $string ? "IS" : "is NOT" ),
" in the array\n";
让我强调,如果您计划在阵列上进行许多查找,那么进行哈希查找是很好的。此外,它只有在匹配意味着$foo eq $bar
或其他通过规范化可以满足的要求(如不区分大小写)时才会起作用。
答案 4 :(得分:5)
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @bar = qw(aaa bbb);
my @foo = grep {/aAa/i} @bar;
print Dumper \@foo;
答案 5 :(得分:2)
Perl字符串匹配也可用于简单的是/否。
my @foo=("hello", "world", "foo", "bar");
if ("@foo" =~ /\bhello\b/){
print "found";
}
else{
print "not found";
}
答案 6 :(得分:1)
对于布尔匹配结果或出现次数,您可以使用:
use 5.014; use strict; use warnings;
my @foo=('hello', 'world', 'foo', 'bar', 'hello world', 'HeLlo');
my $patterns=join(',',@foo);
for my $str (qw(quux world hello hEllO)) {
my $count=map {m/^$str$/i} @foo;
if ($count) {
print "I found '$str' $count time(s) in '$patterns'\n";
} else {
print "I could not find '$str' in the pattern list\n"
};
}
输出:
I could not find 'quux' in the pattern list
I found 'world' 1 time(s) in 'hello,world,foo,bar,hello world,HeLlo'
I found 'hello' 2 time(s) in 'hello,world,foo,bar,hello world,HeLlo'
I found 'hEllO' 2 time(s) in 'hello,world,foo,bar,hello world,HeLlo'
不需要使用模块 当然,它不像上面的一些代码那样“可扩展”和多功能 我将此用于交互式用户答案,以匹配一组预定义的案例不敏感答案。