迭代A Perl Hash会打印出一个内存地址

arj*_*ini 1 memory perl hash hashmap

以下子例程用于迭代节点数组(每个节点的哈希值都有一个大陆)并返回所有国家/地区的列表:

sub getContinentsServed{
    my $self = shift;
    my $temp = $self->{cityListRef};
    my %hash = {};
    my $h_ref = \%hash;
    foreach my $cont (@{$temp}){
        $h_ref->{$cont->{continent}} = '1';
    }
    print "Continents Served: ";
    foreach my $coord (keys %hash){
        print $coord;
        print " , ";
    }
} 
Run Code Online (Sandbox Code Playgroud)

我很确定这包含所有正确的数据,但是当我尝试打印这些值时,我得到了这个结果:

Continents Served: Australia Europe North America South America Asia Africa HASH(0x100949a70) 
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我会得到最后一个元素HASH(0x1009...).我宁愿这不会出现,但我所做的只是迭代键,所以我不确定为什么或如何那样.

hob*_*bbs 8

my %hash = {};
Run Code Online (Sandbox Code Playgroud)

是坏是坏.这是设置%hash为包含一个条目,其中键是字符串化的值{}(哈希引用,因此它将是一个字符串HASH(0xblahblah)),值为undef.

你真正需要写的只是my %hash;(或者my %hash = ();已经隐含了,所以没有必要写它).或者你可以做到my $h_ref;并且从不使用%hash({}由于自动修复,初始化仍然是不必要的).

如果你use warnings打开了,你至少会得到一个"哈希中奇数个元素"或"找到偶数大小列表所需的参考"(取决于你的perl的年龄)警告该行给你一个提示那里出了点问题.