我会简短,所以我不浪费你的时间;
简单的问题,我有一堆说,数百只狗
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;
}
感谢您提前得到任何答案,我感谢你们帮助我解决可能是一个非常愚蠢的问题。谢谢
答案 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)
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方法。
经典方法是grep和List::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)/);