1

我在 perl 文件中有一个哈希(我们称之为 test2.pl),如下所示:

our %hash1;

my %hash2 = {
    one   => ($hash1{"zero1"},  $hash1{"one1"}  ),
    two   => ($hash1{"one1"},   $hash1{"two1"}  ),
    three => ($hash1{"two1"},   $hash1{"three1"}),
    four  => ($hash1{"three1"}, $hash1{"six1"}  ),
    five  => ($hash1{"six1"},   $hash1{"one2"}  ),
    six   => ($hash1{"one2"},   $hash1{"two2"}  ),
    last  => ($hash1{"two2"},   $hash1{"last1"} ),
};

这有 6 个Use of uninitialized value in anonymous hash ({}) at test2.pl line 7.错误(文件中的第 7 行对应于该my %hash2行,所有错误都说第 7 行)。

我只能假设这是因为%hash1在另一个调用该文件的文件(test1.pl)中定义。我认为使用our足以定义它。我是否必须初始化哈希中的所有变量才能使其工作?

(我在括号中使用了括号,our因为我在那里声明了其他变量。)

4

1 回答 1

6

在 Perl 中,您将哈希定义为偶数列表。这意味着它们由括号而不是大括号分隔:

my %hash = (
  key1 => "value1",
  key2 => "value2",
);
my $anonHashRef = {
  key1 => "value1",
  key2 => "value2",
};

花括号创建一个新的匿名哈希引用

如果您不想从另一个文件访问哈希,则应package在顶部使用声明:

package FooBar;
# Your %hash comes here
# it HAS to be GLOBAL, i.e. declared with `our`, not `my`

然后我们可以requireuse您的文件(尽管文件名和包名最好是相同的)并将您的哈希作为包全局访问:

在您的主文件中:

use 'file2.pl';
my $element = $FooBar::hash{$key};

请参阅Exporter模块以更好地使用另一个命名空间中的数据结构。

于 2012-09-04T10:43:06.253 回答