2012-09-19 39 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}