Perl のハッシュに関する私の現在の理解に基づいて、このコードは「hello world」を出力すると予想します。代わりに何も出力しません。
%a=();
%b=();
$b{str} = "hello";
$a{1}=%b;
$b=();
$b{str} = "world";
$a{2}=%b;
print "$a{1}{str} $a{2}{str}";
ハッシュは配列のようなものだと思いますが、ハッシュに別のハッシュを含めることができないのはなぜですか?
Perl のハッシュに関する私の現在の理解に基づいて、このコードは「hello world」を出力すると予想します。代わりに何も出力しません。
%a=();
%b=();
$b{str} = "hello";
$a{1}=%b;
$b=();
$b{str} = "world";
$a{2}=%b;
print "$a{1}{str} $a{2}{str}";
ハッシュは配列のようなものだと思いますが、ハッシュに別のハッシュを含めることができないのはなぜですか?
常に「use strict;」を使用する必要があります。あなたのプログラムで。
参照と匿名ハッシュを使用します。
use strict;use warnings;
my %a;
my %b;
$b{str} = "hello";
$a{1}={%b};
%b=();
$b{str} = "world";
$a{2}={%b};
print "$a{1}{str} $a{2}{str}";
{%b}
hash のコピーへの参照を作成します%b
。後で空にするので、ここにコピーする必要があります。
ハッシュのハッシュは、最初から正しく理解するのが難しいものです。この場合
$a{1} = { %b };
...
$a{2} = { %b };
あなたが行きたいところにあなたを連れて行きます。
perldoc perllol
Perl の 2 次元データ構造に関する詳細については、を参照してください。
簡単な答え: ハッシュ キーは、ハッシュではなく、スカラーにのみ関連付けることができます。必要なことを行うには、参照を使用する必要があります。
マルチレベルのデータ構造を作成する方法を再ハッシュ (ヘッ) するよりも、perlreftut を読むことをお勧めします。perlref はより完全ですが、最初は少し圧倒されます。
マイク、アレクサンドルが正解です。
また、ヒント。ハッシュを学んでいるだけなら、perl には Data::Dumper というモジュールがあり、データ構造をきれいに印刷できます。これは、データ構造が持つ値を確認したいときに非常に便利です。
use Data::Dumper;
print Dumper(\%a);
これを印刷すると表示されます
$VAR1 = {
'1' => {
'str' => 'hello'
},
'2' => {
'str' => 'world'
}
};
Perl likes to flatten your data structures. That's often a good thing...for example, (@options, "another option", "yet another")
ends up as one list.
If you really mean to have one structure inside another, the inner structure needs to be a reference. Like so:
%a{1} = { %b };
The braces denote a hash, which you're filling with values from %b, and getting back as a reference rather than a straight hash.
You could also say
$a{1} = \%b;
but that makes changes to %b change $a{1} as well.