Perl,将标量与数组进行比较(使用正则表达式?)

时间:2011-11-21 18:45:10

标签: regex arrays perl comparison match

我会简短,所以我不浪费你的时间;

简单的问题,我有一堆说,数百只狗

my @dogs = qw(Shepard Lab Dalmation Husky Chow Pitbull ...)

我希望将它与单只狗进行比较

my $doggy = "Shepard";

我知道这很愚蠢,但我该怎么做?

# Regex match against array?
# (This doesnt even work but its how i would think of doing it)
if ($doggy =~ /@dogs/) {
print $doggy;
}

感谢您提前得到任何答案,我感谢你们帮助我解决可能是一个非常愚蠢的问题。谢谢

7 个答案:

答案 0 :(得分:5)

我会这样做:

my %hDogs = map { $_ => 1 } @dogs;

if(exists($hDogs{$doggy})) { ... }

答案 1 :(得分:4)

你可以使用grep:

my @dogs = qw(Shepard Lab Dalmation Husky Chow Pitbull);
my @wanted_dogs = grep {/^Shepard$/} @dogs;
print "@wanted_dogs\n";

结果:

Shepard

正则表达式可以根据需要进行更改,如果您只对第一个匹配的狗感兴趣,您会在$wanted_dogs[0]中找到它。

答案 2 :(得分:3)

Smart match operator

use warnings;
use strict;

my @dogs = qw(Shepard Lab Dalmation Husky Chow Pitbull);
my $doggy = "Shepard";
if ($doggy ~~ @dogs) {
    print $doggy;
}

答案 3 :(得分:2)

假设你真的不想要正则表达式匹配,只想查看列表中某处是否存在完全匹配,那么你有很多选择。

Smart match是一种相对较新但最简单的possibly fastest方法。

经典方法是grepList::Util::first。如果您希望(例如)在eq为“Shep”时匹配“Shepard”,则可以调整后两者以使用正则表达式而不是$dog

use strict;
use warnings;
use v5.10;

my @dogs = qw(Shepard Lab Dalmation Husky Chow Pitbull);
my $dog = "Shepard";
my $cat = "Ocicat";

say "Smart match";
say $dog ~~ @dogs;
say $cat ~~ @dogs;

say "Grep";
say grep { $_ eq $dog } @dogs;
say grep { $_ eq $cat } @dogs;

say "List::Util";
use List::Util qw/first/;
say first { $_ eq $dog } @dogs;
say first { $_ eq $cat } @dogs;

答案 4 :(得分:1)

有些技术使用较新的智能匹配运算符,但我更喜欢旧的经典:

my $dogs_re = join '|' => map quotemeta, @dogs;

if ($doggy =~ /$dogs_re/) {...}

在引用名称中的任何正则表达式特殊字符后,会创建您的狗类型的正则表达式替换。

如果需要,您也可以编译正则表达式:

$_ = qr/$_/ for $dogs_re;  

将放在定义$ dogs_re的行之后,如果您多次使用正则表达式,可能会提供一些性能优势。

答案 5 :(得分:0)

我可能会选择哈希查找解决方案来获得最佳答案,但有很多方法可以做到这一点。这是其中之一。

请注意,这会使用我们的狗名作为正则表达式,并在列表上迭代它而不是相反。

use v5.10; # needed for say
@dogs=qw(Shepherd Lab Poodle Foo Bar); 
$dog = 'Lab'; 
/\Q$dog\E/i and say for @dogs;"

您可以控制匹配的严格程度:

/\Q$dog\E/i最不严格,忽略大小写,匹配单词中的任何位置。例如。 “实验室”将匹配“黄色实验室”,“拉布拉多”等。

/^\Q$dog\E$/最严格,匹配大小写,匹配整个单词。

答案 6 :(得分:0)

试试这个,

$" = "|";
my @dogs=qw(Shepherd Lab Poodle Foo Bar);
my $temp = "@dogs";
my $dog = "Lab";
print "$1 found" if ($dog =~ /($temp)/);