在Perl中查找哈希数组的大小

时间:2012-09-19 15:22:54

标签: arrays perl hash

如何获得以下哈希数组的大小?

我认为这会做到,但它不起作用......

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(主菜,沙漠,饮料)?

2 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分: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函数(在这种情况下无效)向转储器提供此标量值时,您将获得上面$v中显示的打印值。 scalar所做的就是更改与print一起使用的上下文,并强制执行标量上下文而不是列表上下文。我们可以使用标量赋值($size$size2)来执行相同的操作。

使用原始结构时,需要使用@{ }括号来阐明perl,其中的内容是数组引用。

如您所见,使用map语句可以轻松地提取值。它充当循环,迭代@$v(或@{ $item->{detail} })中的所有值,为每个值返回语句$_->{url_name}