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の内部に配列参照があることを明確にする必要があります。

mapご覧のとおり、値の抽出はステートメントを使用して簡単に実行できます。これはループとして機能し、@$v(または@{ $item->{detail} })のすべての値を反復処理し、値ごとにステートメントを返します$_->{url_name}

于 2012-09-19T15:49:20.743 に答える