如何获得以下哈希数组的大小?
我认为这会做到,但它不起作用......
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
(主菜,沙漠,饮料)?
答案 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}
。