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

Mik*_*ike 36 string perl search text

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

一个警告,我希望搜索不区分大小写

所以"aAa"会在("aaa","bbb")

Eth*_*her 143

这取决于您希望搜索执行的操作:

所有这些示例的核心都做了类似的事情,但是它们的实现经过了大量优化,速度很快,并且比使用grep,mapfor循环编写的任何pure-perl实现都要快.


请注意,执行循环的算法与执行单个匹配是一个单独的问题.要匹配不区分大小写的字符串,您只需i在模式中使用该标志: /pattern/i.如果你以前没有这样做,你一定要仔细阅读perldoc perlre.


Pet*_*ans 29

我猜

@foo = ("aAa", "bbb");
@bar = grep(/^aaa/i, @foo);
print join ",",@bar;
Run Code Online (Sandbox Code Playgroud)

会做的伎俩.

  • 也许:@bar = grep(/ ^ aaa $/i,@ foo); 因为你写的将搜索以/ aaa/i开头的所有字符串,所以它也会找到/ aaaa /和/ aaaa + /. (9认同)

Zai*_*aid 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!"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,智能匹配功能是实验性的([来源](https://metacpan.org/pod/release/RJBS/perl-5.18.0/pod/perldelta.pod#The-smartmatch-family-of-features -are,现在已经实验)) (2认同)

dao*_*oad 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";
Run Code Online (Sandbox Code Playgroud)

让我强调,如果您计划对阵列执行许多查找,那么执行哈希查找是很好的.此外,它只有在匹配意味着$foo eq $bar或通过规范化可以满足的其他要求(如不区分大小写)时才有效.


Ale*_*lds 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;
Run Code Online (Sandbox Code Playgroud)