我有一个常量的哈希,我想在另一个文件中迭代。所以我有一个包含全局常量的文件:
use base qw (Exporter);
use constant ERROR_CONFIG => {
ERROR_STRING => {
errorCode => 1234,
default => 'Some default text here',
},
ERROR_STRING => {
errorCode => 12345,
default => 'More text',
},
};
所以我似乎可以在另一个文件中访问它,但我无法遍历它。
我想迭代每个键(ERROR_STRING)
然后我想迭代它并推入一个arrayref,但Perl似乎并不认为它是一个哈希。我尝试了以下但是当我抛弃结果时它没有用:
my @array = ();
$stringsRef = \@array;
my %config = &ERROR_CONFIG;
foreach my $key (keys %config) {
push @$stringsRef, {name => 'ERROR_MESSAGE_' . $key};
}
Data::Dumper::Dumper($stringsArray);
我似乎没有得到任何结果,只是一个错误,即使我尝试直接输入& ERROR_CONFIG而不是%config。
答案 0 :(得分:1)
你在常量的定义中有错误。您必须=>
而不是=
:
use constant ERROR_CONFIG => {
# here __^^
ERROR_STRING => {
errorCode => 1234,
default => 'Some default text here',
},
ERROR_STRING => {
errorCode => 12345,
default => 'More text',
},
};
并且你不能在哈希中使用两次相同的密钥。我想你想要一个数组:
use constant ERROR_CONFIG => [
ERROR_STRING => {
errorCode => 1234,
default => 'Some default text here',
},
ERROR_STRING => {
errorCode => 12345,
default => 'More text',
},
];
答案 1 :(得分:0)
您的代码:
use base qw (Exporter);
use strict;
use warnings;
use constant ERROR_CONFIG = {
ERROR_STRING => {
errorCode => 1234,
default => 'Some default text here',
},
ERROR_STRING => {
errorCode => 12345,
default => 'More text',
},
};
给我:
Can't modify constant item in scalar assignment at line 14, at EOF
。
我认为这将是你的问题。我实际上并不认为你可以像这样定义一个常量 - 散列哈希实际上是一个引用列表。引用可能是不变的,但它的目标可能不是。
但更重要的是 - 您正在尝试复制您的哈希密钥,而且这根本不会发挥作用。您不能有两个名为' ERROR_STRING'的哈希元素。
正如其他撰稿人所述 - 将其更改为' =>'有效,但你仍然得到一系列非常数元素:
print ERROR_CONFIG->[0],"\n";
print Dumper ERROR_CONFIG;
ERROR_CONFIG->[0] = "wibble";
print Dumper ERROR_CONFIG;
&ERROR_CONFIG
也无法开展工作。 &
在perl中没有取消引用,它是子程序的标志。 ERROR_CONFIG
不是一个子,所以它不会起作用。
我个人建议:
use base qw (Exporter);
use strict;
use warnings;
our %error_config = (
1234 => 'Some default text',
12345 => 'More text',
);
foreach my $key (keys %error_config) {
print "$key $error_config{$key}\n";
}
接受你的哈希不是一个常数。或者,如果您确实需要不进行更改,请使用Hash::Util
和lock_hash_recurse
,或者将其设置为“私人”'哈希和使用访问器。
{
my %private_hash = (
1234 => 'Some default text',
12345 => 'More text',
);
sub get_errors {
return %private_hash;
}
}
my %error_codes = get_errors();
print Dumper \%error_codes
(如果你真的想要,你可以使用一些存取器来改变私人doodad,但你似乎正在将你的常数复制到一个非常数,所以它似乎没有必要)。