Eth*_*her 143
这取决于您希望搜索执行的操作:
如果要查找所有匹配项,请使用内置的grep:
my @matches = grep { /pattern/ } @list_of_strings;
Run Code Online (Sandbox Code Playgroud)如果你想找到第一个匹配项,请first在List :: Util中使用:
use List::Util 'first';
my $match = first { /pattern/ } @list_of_strings;
Run Code Online (Sandbox Code Playgroud)如果要查找所有匹配的计数,请true在List :: MoreUtils中使用:
use List::MoreUtils 'true';
my $count = true { /pattern/ } @list_of_strings;
Run Code Online (Sandbox Code Playgroud)如果你想知道第一个匹配的索引,请first_index在List :: MoreUtils中使用:
use List::MoreUtils 'first_index';
my $index = first_index { /pattern/ } @list_of_strings;
Run Code Online (Sandbox Code Playgroud)如果你想简单地知道是否有匹配,但你不关心它是哪个元素或它的值,请any在List :: Util中使用:
use List::Util 1.33 'any';
my $match_found = any { /pattern/ } @list_of_strings;
Run Code Online (Sandbox Code Playgroud)所有这些示例的核心都做了类似的事情,但是它们的实现经过了大量优化,速度很快,并且比使用grep,map或for循环编写的任何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)
会做的伎俩.
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)
如果您要对数组执行多次搜索,并且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或通过规范化可以满足的其他要求(如不区分大小写)时才有效.
#!/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)
| 归档时间: |
|
| 查看次数: |
178384 次 |
| 最近记录: |