2010-12-09 67 views
0
@array1 = ('20020701', 'Sending Mail in Perl', 'Philip Yuson'); 
@array2 = ('20020601', 'Manipulating Dates in Perl', 'Philip Yuson'); 
@array3 = ('20020501', 'GUI Application for CVS', 'Philip Yuson'); 

@main = (\@array1, \@array2, \@array3); 
use Data::Dumper ; 
print Dumper \@main ; 
print grep { $_ =~ /Manipulating Dates in Perl/} @main ; 

如何使grep工作?如何grep陣列

回答

2
print grep { $_->[1] =~ /Manipulating Dates in Perl/} @main ; 

如果你只是去扁帶比較,你應該使用這樣的:

print grep { $_->[1] eq 'Manipulating Dates in Perl'} @main ; 

正則表達式將會匹配任何字符串包含字符串「處理日期在Perl」。

要解釋,$_將包含數組引用。 $_->[1]將取消引用數組索引獲得元件1

+2

打印數組引用,可能沒有什麼是真正想要的(雖然什麼*的*想是一個謎) – ysth 2010-12-09 17:21:58

+1

@ysth:好一點。是的,這將打印arrayref,但它至少會grep並打印* correct * arrayref。 :) – cdhowie 2010-12-09 17:22:38

0

你匹配的模式之前,你可以字符串化內陣列:

@result = grep { "@$_" =~ /Manipulating Dates in Perl/ } @main; 

這也可能是爲smart match operator工作:

@result = grep { $_ ~~ /Manipulating Dates in Perl/} @main; 

這與@main中的任何數組引用都有至少一個匹配給定正則表達式的元素。

在這兩種情況下,輸出都是數組引用的列表,這可能不是您想要顯示的內容。

0

提領他們配圖:

grep { $_ =~ /please match/ } map { @{$_} } @arrays 

老實說,它看起來像你寧願有哈希引用:

my @docs = ( 
    {id => '20020701', "title" => 'Sending Mail in Perl', "author" =. 'Philip Yuson'}, 
    {id => '20020601', "title" => 'Manipulating Dates in Perl', "author" => 'Philip Yuson'} 
); 

foreach (grep { $_->{"title"} =~ /Manipulating Dates/ } @docs) { 
    print "Got match " . $_->{"id"} . "\n"; 
} 
0

希望這有助於...

使用功能 '說' ;

my @fruit  = ('apples', 'oranges', 'pears', 'bananas', 'grapes'); 
my @dry_goods = ('corn meal', 'sugar', 'flour', 'corn flakes'); 
my @sea_food = ('flounder', 'lobster', 'baked clams'); 
my @drinks  = ('apple juice', 'milk', 'coke'); 

my @groceries = (\@fruit, \@dry_goods, \@sea_food, \@drinks); 

foreach ( map { grep {/apple/} @{$_} } @groceries) { say $_ };