Regex Perl,比较标量和数组(使用正则表达式?)

Regex Perl,比较标量和数组(使用正则表达式?),regex,arrays,perl,comparison,match,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 ($

我会很简短,这样我就不会浪费你的时间

简单的问题,我有一个数组,比如说,数百只狗

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;
}

谢谢你们提前给我答案,我很感谢你们帮我解答这个可能很愚蠢的问题。谢谢

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

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

if ($doggy =~ /$dogs_re/) {...}
这将在名称中引用任何正则表达式特殊字符后,创建狗类型的正则表达式替换

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

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

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

我会这样做:

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

if(exists($hDogs{$doggy})) { ... }
您可以使用grep:

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

Shepard

正则表达式可以根据需要进行更改,如果您只对第一条匹配的狗感兴趣,您会发现在
$wanted\u dogs[0]

中,假设您并不真正想要正则表达式匹配,只想查看列表中的某个地方是否存在精确匹配,那么您有许多选项

这是一种相对较新但最简单的方法

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

:


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

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

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
是最不严格的,忽略大小写,匹配word中的任意位置。例如,“实验室”将与“黄色实验室”、“拉布拉多”等匹配

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

试试这个

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

所以,你想“将它与一只狗进行比较”-这种比较不会总是返回错误,因为它们是不平等的吗?或者你想在狗的列表中找到你的狗的索引?你想确认你的狗在名单上吗?请说得更具体一点。是的,就像你说的,在列表中找到我的狗索引,这样我就可以查看谢泼德是否在主狗列表中,所以将“主狗列表”转换为哈希,并使用if exists语句查看它是否在哈希中,谢谢你的回答我在想我是否应该用hash's或not@user1058357有10多种方法可以做到这一点:)呵呵,如果我只能想到1种不起作用的方法,那一定很糟糕:P@user1058357我们都经历过。别让它影响到你。谢谢你,这个答案很有帮助,我也很高兴。这就是grep的用意,而且它做得很好。这让我有点难以理解,但我相信这是一个很好的解决方案,我会再读几百遍:P,谢谢你的回答啊,好吧,我理解,它相当于一个有多个匹配选项的正则表达式:(Shepard | Husky | Chow),然后它可以执行一个正则表达式,这真的很有用,因为我将重复使用正则表达式数百次,需要对其进行编译以提高速度,非常感谢。@user1058357:请考虑使用一个模块来优化这些正则表达式。Regexp::Assemble开始mind@Zaid=>从5.9.2开始,Perl的正则表达式引擎将自动优化像这样的链式替换,并将其放入trie中。
$dogs\u re=qr/$dogs\u re/
更短,更易于理解,imho。感谢您的输入,敬请提供任何建议。目前不确定我将使用什么方法。请使用智能匹配,除非您有一个无法升级的过时Perl(在这种情况下,请使用List::Util)。谢谢您的回答,谢谢
use v5.10; # needed for say
@dogs=qw(Shepherd Lab Poodle Foo Bar); 
$dog = 'Lab'; 
/\Q$dog\E/i and say for @dogs;"
$" = "|";
my @dogs=qw(Shepherd Lab Poodle Foo Bar);
my $temp = "@dogs";
my $dog = "Lab";
print "$1 found" if ($dog =~ /($temp)/);