迭代perl中的全局哈希常量

时间:2014-12-10 13:22:19

标签: perl hash constants

我有一个常量的哈希,我想在另一个文件中迭代。所以我有一个包含全局常量的文件:

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。

2 个答案:

答案 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::Utillock_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,但你似乎正在将你的常数复制到一个非常数,所以它似乎没有必要)。