2015-03-02 80 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中的文檔說明了爲什麼參考文獻是件好事;-)