2012-09-19 81 views
1

如何獲得以下散列數組的大小?在Perl中查找散列數組的大小

我認爲這將做到這一點,但沒有奏效...

print Dumper scalar $item->{'detail'}; 
$VAR1 = [ 
    { 'content' => undef, 'name' => 'entree', 'url_name' => 'entree' }, 
    { 'content' => undef, 'name' => 'dessert', 'url_name' => 'desert' }, 
    { 'content' => undef, 'name' => 'drink', 'url_name' => 'drink' } 
]; 

要不我怎麼能打印所有url_name哈希值的陣列中(主菜,沙漠,飲料)不知道大小?

回答

8

您有一個數組引用。要獲得引用數組的大小,首先取消引用參考:

print scalar @{$item->{'detail'}}; 

並列出網址:

my $v = [ 
     { 'content' => undef, 'name' => 'entree', 'url_name' => 'entree' }, 
     { 'content' => undef, 'name' => 'dessert', 'url_name' => 'desert' }, 
     { 'content' => undef, 'name' => 'drink', 'url_name' => 'drink' } 
]; # or $v = $item->{'detail'}; 

foreach my $h (@$v) { 
    print $h->{url_name}, "\n"; 
} 
+0

哪一行是? – perreal

+0

我的錯誤...完美的工作,節省了我幾個小時 – mamesaye

1

我不知道爲什麼你認爲你需要數組的大小,以打印url_name值。儘管如此,這是它的工作原理。

use strict; 
use warnings; 
use Data::Dumper; 

my $v = [ # note that this is a scalar value 
    { 'content' => undef, 'name' => 'entree', 'url_name' => 'entree' }, 
    { 'content' => undef, 'name' => 'dessert', 'url_name' => 'desert' }, 
    { 'content' => undef, 'name' => 'drink', 'url_name' => 'drink' } 
]; 
my $item = { detail => $v };  # recreate your structure $item->{detail} 
my $size = @$v;      # this is how its done with $v 
my $size2 = @{ $item->{detail} }; # and with your original structure 
my @x = map $_->{url_name}, @$v; # extract url_name values 
print Dumper \@x; 

正如你看到的,$item->{detail}$v是相同的。當您直接將這個標量值(通過scalar函數,在這種情況下不執行任何操作)提供給Dumper時,您將獲得上面$v中顯示的打印值。 scalar所做的就是更改與print一起使用的上下文,並強制執行標量上下文而不是列表上下文。我們可以通過使用標量分配($size$size2)來做同樣的事情。

當使用原始結構時,您需要使用@{ }括號來闡明perl,它們內部是數組ref。

如您所見,提取值很容易通過map語句完成。它充當一個循環,遍歷@$v(或@{ $item->{detail} })中的所有值,併爲每個值返回語句$_->{url_name}