私は以下のような構造を持っています:
my $var1 = [{a=>"B", c=>"D"}, {E=>"F", G=>"H"}];
今、最初のハッシュとその中の要素をトラバースしたい..どうすればいいですか?
ダンパーを実行すると、ハッシュが表示され$var1
ます。Array
@var1
私は以下のような構造を持っています:
my $var1 = [{a=>"B", c=>"D"}, {E=>"F", G=>"H"}];
今、最初のハッシュとその中の要素をトラバースしたい..どうすればいいですか?
ダンパーを実行すると、ハッシュが表示され$var1
ます。Array
@var1
他の配列と同じように配列を反復処理すると、ハッシュ参照が得られます。次に、単純なハッシュ参照の場合と同様に、各ハッシュのキーを反復処理します。
何かのようなもの:
foreach my $hash (@{$var1}) {
foreach my $key (keys %{$hash}) {
print $key, " -> ", $hash->{$key}, "\n";
}
}
まず、ベアワードを含む変数宣言で Perl の厳密モードをトリップします。
それを念頭に置いて、以下に示す注釈付きの例を完成させてください。
use strict;
my $test = [{'a'=>'B','c'=>'D'},{'E'=>'F','G'=>'H'}];
# Note the @{ $test }
# This says "treat this scalar reference as a list".
foreach my $elem ( @{ $test } ){
# At this point $elem is a scalar reference to one of the anonymous
# hashes
#
# Same trick, except this time, we're asking Perl
# to treat the $elem reference as a reference to hash
#
# Hence, we can just call keys on it and iterate
foreach my $key ( keys %{ $elem } ){
# Finally, another bit of useful syntax for scalar references
# The "point to" syntax automatically does the %{ } around $elem
print "Key -> $key = Value " . $elem->{$key} . "\n";
}
}
C:\wamp\bin\perl\bin\PERL_2~1\BASIC_~1\REVISION>type traverse.pl
my $var1=[{a=>"B", c=>"D"},{E=>"F", G=>"H"}];
foreach my $var (@{$var1}) {
foreach my $key (keys(%$var)) {
print $key, "=>", $var->{$key}, "\n";
}
print "\n";
}
C:\wamp\bin\perl\bin\PERL_2~1\BASIC_~1\REVISION>traverse.pl
c=>D
a=>B
G=>H
E=>F
$var1 = []
無名配列への参照です
@
のようにその前にシジルを使用する$var1
と、参照している配列にアクセスできます。foreach (@arr) {...}
あなたと同じようにforeach (@{$var1}) {...}
.
ここで、提供した配列の要素@{$var1}
も匿名 (名前がないことを意味します) ですが、匿名のハッシュであるため、arrayref と同様に、ここで%{$hash_reference}
によって参照されるハッシュへのアクセスを取得します$hash_reference
。ここでは、$hash_reference
です$var
。
を使用してハッシュにアクセスした後、または%{$var}
を使用してハッシュのキーに簡単にアクセスできます。返される結果はキーの配列であるため、内部で使用できます。keys(%$var)
keys(%{$var})
keys(%{$var})
foreach (keys(%{$var})) {...}
のようなキーを使用して、匿名ハッシュ内のスカラー値にアクセスします。$hash_reference->{$keyname}
これがすべてのコードです。
配列に : のような配列の匿名ハッシュが含まれている場合
、配列値にアクセスする$var1=[ { akey=>["b", "c"], mkey=>["n", "o"]} ];
方法は次のとおりです。
C:\wamp\bin\perl\bin\PERL_2012\BASIC_PERL\REVISION>type traverse.pl
my $var1=[ {akey=>["b", "c"], mkey=>["n", "o"]} ];
foreach my $var (@{$var1}) {
foreach my $key (keys(%$var)) {
foreach my $elem (@{ $var->{$key} }) {
print "$key=>$elem,";
}
print "\n...\n";
}
print "\n";
}
C:\wamp\bin\perl\bin\PERL_2012\BASIC_PERL\REVISION>traverse.pl
mkey=>n,mkey=>o,
...
akey=>b,akey=>c,
...
もっと定期的に練習すれば、複雑な構造をそのような組み合わせに分解することがすぐに簡単になります。これは私が別のソフトウェア用に大きなパーサーを作成した方法です。あなたの質問に対する答えがいっぱいです:)
上記の amon の賛成票のコメントを 1 のぞき見るだけで (ありがとう、amon!)、このちょっとしたことを書くことができました。
#!/usr/bin/perl
# Given an array of hashes, print out the keys and values of each hash.
use strict; use warnings;
use Data::Dump qw(dump);
my $var1=[{A=>"B",C=>"D"},{E=>"F",G=>"H"}];
my $count = 0;
# @{$var1} is the array of hash references pointed to by $var1
foreach my $href (@{$var1})
{
print "\nArray index ", $count++, "\n";
print "=============\n";
# %{$href} is the hash pointed to by $href
foreach my $key (keys %{$href})
{
# $href->{$key} ( ALT: $$href{$key} ) is the value
# corresponding to $key in the hash pointed to by
# $href
# print $key, " => ", $href->{$key}, "\n";
print $key, " => ", $$href{$key}, "\n";
}
print "\nCompare with dump():\n";
dump ($var1);
print "\nJust the first hash (index 0):\n";
# $var1->[0] ( ALT: $$var1[0] ) is the first hash reference (index 0)
# in @{$var1}
# dump ($var1->[0]);
dump ($$var1[0]);
#print "\nJust the value of key A: \"", $var1->[0]->{A}, "\"\n";
#print "\nJust the value of key A: \"", $var1->[0]{A}, "\"\n";
print "\nJust the value of key A: \"", $$var1[0]{A}, "\"\n"