Perl:Grep在一个数组中

时间:2014-07-20 16:45:39

标签: perl

我有一个以下格式的数组

array

Link-IF-A<->IF-B
Link-IF-C<->IF-D
Link-IF-E<->IF-F
Link-IF-G<->IF-H
Link-IF-I<->IF-J

我正在尝试搜索界面&#34; IF-D&#34;但值始终显示为0。 我希望看到1,当它匹配其他0.我已经尝试了以下所有方法,但每次结果都是0。

$link = IF-D

method1 :

my $result = grep /$link/,@array;

method 2:

my $result = grep /^$link,/,@array;

method3 :

my $result = grep(/^$link$/, @array)

由于

2 个答案:

答案 0 :(得分:3)

您的第二种和第三种方法永远不会匹配,因为您的目标字符串都不会开头,或只包含IF-D。第二种方法使用^,锚定到目标字符串的开头,第三种方法包含^$,强制模式匹配整个目标字符串,而不仅仅是某些部分它的。所以那些总是会失败的(看起来你只是随意地尝试看看它们是否有效,特别是在正则表达式的情况下,这不是实现目标的好方法。)< / p>

第一个例子将匹配一次;第二个元素,因为模式IF-D匹配目标字符串Link-IF-C<->IF-D的末尾。但是,只有当你的目标字符串和你的模式符合你的想法时,它才会起作用。在您向我们展示的示例代码中,模式字符串未包含在引号中。一定是。

因此,例如,执行您想要的操作:

my $link = "IF-D";

my @array = qw(
    Link-IF-A<->IF-B                                                            
    Link-IF-C<->IF-D                                                            
    Link-IF-E<->IF-F                                                            
    Link-IF-G<->IF-H                                                            
    Link-IF-I<->IF-J                                                            
);        

my $found = grep /\Q$link/, @array;
print "$found\n"; # 1

对于您演示的模式,\Q并非严格必要。这种结构迫使$link的内容按字面意思对待,而不是作为符号符号。您的示例模式不包含任何元符号,但如果它意外发生,\Q将对它们进行去除。

如果你认为你已经在语义上实现了与这个例子相同的东西,但是它没有起作用,那么你就找到了为什么人们要求那些提出问题的人发布一个小的自足的代码片段,用于演示他们所描述的行为。如果我的示例代码没有解决问题,请将代码简化为显示问题的单个代码段,并将其添加为您问题的更新,以便我们可以自行运行并确切地查看您的问题&#39谈论。

答案 1 :(得分:1)

您必须在作业中使用双引号或单引号:

$link = "IF-D";

而不是$link = IF-D

use strict;                                                                     
use warnings;                                                                   

my @array = qw(                                                                 
    Link-IF-A<->IF-B                                                            
    Link-IF-C<->IF-D                                                            
    Link-IF-E<->IF-F                                                            
    Link-IF-G<->IF-H                                                            
    Link-IF-I<->IF-J                                                            
);                                                                              

my $link = "IF-D";                                                              

print scalar grep /$link/, @array;