2015-03-02 42 views
2

我想在Perl中使用grep函数来查找数组中正则表达式匹配的数量。我知道grep应该采取一个列表作为其参数,但不幸的是,我试图访问的数据是以数组的形式。下面是我的问题的一个简化示例:如何在数组中使用Perl的grep函数?

using strict; 
using warnings; 

my @test = qw(AAA AAB AAC); 
my @test2 = ["AAA", "AAB", "AAC"]; 

my @results = grep(m/AA./, @test); 
my @results2 = grep(m/AA./, @test2); 

print @results . "\n"; 
print @results2 . "\n"; 

第一次打印输出3,因为列表中的每个成员匹配。第二个打印输出0,我假设是因为grep不喜欢数组。有没有我应该使用的替代方案,或者是我的语法不正确?

回答

4

@test2由一个元素是数组引用,而正则表达式的力量字串,有些东西你可能没有想到,

use strict; 
use warnings; 

my @test = qw(AAA AAB AAC); 
my @test2 = ["AAA", "AAB", "AAC"]; 

print "$_\n" for @test; 
print "$_\n" for @test2; 

输出的

AAA 
AAB 
AAC 
ARRAY(0x85bfda8) 

使用my @test2 = ("AAA", "AAB", "AAC");quote word替代运营商my @test2 = qw(AAA AAB AAC);

+1

这很有道理。我没有意识到,方括号创建了一个数组的引用,而不是只填写索引。 – 2015-03-02 23:42:50

1

语法[ ... ]定义了一个数组,而不是一个列表,你的宣言参考

my @test2 = ["AAA", "AAB", "AAC"]; 

相当于

my @test2; 
$test2[0] = ["AAA", "AAB", "AAC"]; 

你可能想分配3个元素来@test2列表。做到这一点的方法是用(...)表示法。

my @test2 = ('AAA', 'AAB', 'AAC'); 
1

如果您希望变量“@test2”为array reference(因为[ ]是此处的匿名数组构造函数),那么您应该给它起一个名称,如$test2(即,一个标量),然后使用grep时取消对它的引用:

my $test2 = ["AAA", "AAB", "AAC"]; 

my @results = grep(m/AA./, @test); 
my @results2 = grep(m/AA./, @$test2); 

如果然后打印@results@results2与“串联他们."\n";这为输出创建标量上下文数组标量环境下会显示元素的数目。 。在阵列中如果使用join打印它会显示元素:

print join "\n", @results2 ; 

输出:

AAA 
AAB 
AAC 

perldoc perlreftut中的文档说明了为什么参考文献是件好事;-)