10

次のコードでは:

use strict;
use warnings;
use Data::Dumper;

my %hash = %Whatever::whatever;
my @array = @Whatever::whatever;
print Dumper \@array;
print Dumper \%hash;

私の理解では、@Whatever::whatever はシンボル テーブルにアクセスしており、シンボル テーブルはハッシュであるため、エラー メッセージは生成されません。しかし、存在しない要素にアクセスするための警告メッセージが少なくとも表示されないのはなぜでしょうか?

4

2 に答える 2

12

Perl ではグローバル変数が存在しない状態でキャッチすることはほとんど不可能だからです。名前で言及するとすぐに、それを参照するためだけでも、それは存在します。また、配列とハッシュはスカラーとは異なるためです。value を保持するスカラーが存在し、undefほとんどの目的で使用されると「初期化されていない値の使用」警告がトリガーされます。しかし、配列とハッシュは空の配列とハッシュとして存在し空の配列やハッシュは警告するほど例外的ではありません!

于 2012-05-18T04:39:25.480 に答える
1

(コメントからの適応/移行)

代わりに、「シンボルテーブルにアクセスする... [やや]ハッシュ」ではなく、パッケージで名前が@Whatever::whatever付けられた動的スコープの配列を識別すると言います。@whateverWhatever

そのような修飾された識別子は、常に制限を回避してきました ( のドキュメントを参照してくださいstrict 'vars')。

于 2012-05-21T14:08:36.890 に答える