我可以使用其他文件的哈希值吗?

时间:2012-09-04 10:26:47

标签: perl variables hash

我在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括号,因为我在那里声明了其他变量。)

1 个答案:

答案 0 :(得分:6)

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

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

Curly braces创建一个新的匿名哈希引用

如果你不想从另一个文件访问哈希,你应该在顶部使用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模块,了解如何在另一个命名空间中使用数据结构。