3

このPerlプログラムの出力を理解するのを手伝ってくれる人がいます:

use Data::Dumper;
my %hash;
$hash{hello} = "foo";
$hash{hello}{world} = "bar";
print $hash{hello} . "\n";
print $hash{hello}{world} . "\n";
print Dumper(\%hash);

そして出力:

foo
bar
$VAR1 = {
          'hello' => 'foo'
        };

「フ」はどこから来たのですか?ダンパーで出力されないのはなぜですか?

割り当ての順序を入れ替えると、次のようになります。

use Data::Dumper;
my %hash;
$hash{hello}{world} = "bar";
$hash{hello} = "foo";
print $hash{hello} . "\n";
print $hash{hello}{world} . "\n";
print Dumper(\%hash);

私の出力は私が期待するものです:

foo

$VAR1 = {
          'hello' => 'foo'
        };

編集:use strict;これがキャッチされることはわかっていますが、文字列「foo」がまだどのように出力されているかを知りたいです。

4

4 に答える 4

17

コードがありません

use strict;
C:\Temp> ホイ
"strict refs" が使用されている間は、文字列 ("foo") を HASH ref として使用できません
C:\Temp\hui.pl 行 7.

すべてのスクリプトが次で始まることを確認してください。

use strict;
use warnings;

与えられた:

$hash{hello} = "foo";

$hash{hello}はハッシュ参照ではありません。

$hash{hello}{world} = "bar";

文字列"foo"をハッシュ参照として扱い、ハッシュを作成して%main::fooに設定$foo{world}"bar"ます。

あなたがするとき:

print Dumper \%hash;

の内容のみを出力し%hashます。一方、あなたがするとき

print $hash{hello}{world} . "\n";

それは印刷し$foo{world}ます。

がなければstrict、スクリプトがパッケージの名前空間全体を踏みにじっていることを知ることはできません。

を追加

print Dumper \%main::;

また

print Dumper \%main::foo;

これを実行した後にシンボルテーブルを調べます。

于 2009-11-18T22:12:33.497 に答える
2

基本的に、文字列 "foo" は の唯一の値ですが%hash、(非厳密性のため) %foo が作成されています。(world => "bar")

于 2009-11-18T22:26:16.320 に答える
1

自動有効化は、未定義の値で開始した場合にのみ機能します。あなた$hash{hello}は未定義の値ではないので、次のレベルを自動活性化しません。代わりに$hash{hello}、ソフト リファレンスとして使用することになります。

于 2009-11-19T20:59:33.333 に答える
1

strict を使用していた場合、スクリプトでエラーが発生します。

"strict refs" が使用されている間は、文字列 ("foo") を HASH ref として使用できません ...

于 2009-11-18T22:14:38.743 に答える