8

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}"; 

ハッシュは配列のようなものだと思いますが、ハッシュに別のハッシュを含めることができないのはなぜですか?

4

5 に答える 5

6
  1. 常に「use strict;」を使用する必要があります。あなたのプログラムで。

  2. 参照と匿名ハッシュを使用します。

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。後で空にするので、ここにコピーする必要があります。

于 2010-05-25T21:29:28.720 に答える
6

ハッシュのハッシュは、最初から正しく理解するのが難しいものです。この場合

$a{1} = { %b };
...
$a{2} = { %b };

あなたが行きたいところにあなたを連れて行きます。

perldoc perllolPerl の 2 次元データ構造に関する詳細については、を参照してください。

于 2010-05-25T21:29:32.713 に答える
4

簡単な答え: ハッシュ キーは、ハッシュではなく、スカラーにのみ関連付けることができます。必要なことを行うには、参照を使用する必要があります。

マルチレベルのデータ構造を作成する方法を再ハッシュ (ヘッ) するよりも、perlreftut を読むことをお勧めします。perlref はより完全ですが、最初は少し圧倒されます。

于 2010-05-25T21:50:26.643 に答える
2

マイク、アレクサンドルが正解です。

また、ヒント。ハッシュを学んでいるだけなら、perl には Data::Dumper というモジュールがあり、データ構造をきれいに印刷できます。これは、データ構造が持つ値を確認したいときに非常に便利です。

use Data::Dumper;
print Dumper(\%a); 

これを印刷すると表示されます

$VAR1 = {
          '1' => {
                   'str' => 'hello'
                 },
          '2' => {
                   'str' => 'world'
                 }
        };
于 2010-05-25T21:44:57.747 に答える
1

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.

于 2010-05-25T21:38:08.210 に答える