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の内部に配列参照があることを明確にする必要があります。
map
ご覧のとおり、値の抽出はステートメントを使用して簡単に実行できます。これはループとして機能し、@$v
(または@{ $item->{detail} }
)のすべての値を反復処理し、値ごとにステートメントを返します$_->{url_name}
。