1

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

我以为这会做到这一点,但它没有工作......

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在不知道大小的情况下打印哈希数组中的所有(主菜、甜点、饮料)?

4

2 回答 2

8

你有一个数组引用。要获取引用数组的大小,首先取消引用引用:

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

并列出 URL:

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";
}
于 2012-09-19T15:25:42.863 回答
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(or @{ $item->{detail} }) 中的所有值,为每个值返回 statement $_->{url_name}

于 2012-09-19T15:49:20.743 回答