我不确定为什么您认为需要数组大小才能打印 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}
。