如何在Perl数组中搜索匹配的字符串?

时间:2010-05-27 22:57:37

标签: perl string search text

在Perl中搜索匹配字符串的字符串数组的最智能方法是什么?

有一点需要注意,我希望搜索不区分大小写

因此"aAa"位于("aaa","bbb")

7 个答案:

答案 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'

不需要使用模块 当然,它不像上面的一些代码那样“可扩展”和多功能 我将此用于交互式用户答案,以匹配一组预定义的案例不敏感答案。