循环遍历hash-perl中的数组

时间:2014-05-17 12:57:50

标签: arrays perl

我这样做了吗?

my $variable = "hello,world";

my @somearray = split(',',$variable);

my %hash = ( 'somevalue' => @somearray);

foreach my $key ( keys %hash ) {
    print $key;
    foreach my $value ( @{$hash{$key}} ) {
        print $value; #the value is not being read/printed
    }
}

我不知道我是否正在访问存储在特定值

的哈希中的数组

3 个答案:

答案 0 :(得分:1)

你已经被perl的扁平化列表所困扰。你知道,当你这样做时: my %hash = ('somekey' => @somearray),perl将其转换为哈希分配的列表形式。那么,perl实际看到的是:

my %hash = ('somekey' => 'hello', 'world' => ''); # I have put '' for simplicity, though it might well be `undef`

所以,下次当您查看某些键时,您最终会收到字符串' hello'而不是阵列" ['你好','世界']"

要解决此问题,您可以使用引用。 perlref可以为您提供更多信息。

my %hash = ('somekey' => \@somearray);
# $hash{'somekey'} is an array reference now.
# So you use the pointy lookup syntax. 
print $hash{'somekey'}->[0]; 

可视化数据结构的另一个有用工具是使用模块Data::Dumper。它可以在perl核心发行版中使用。使用它就像做:

一样简单
use Data::Dumper;

print Dumper \%hash; # remember to pass in a reference to the actual datastructure, not the data structure itself.

玩得开心!

答案 1 :(得分:1)

这是错误的:

my %hash = ( 'somevalue' => @somearray);

数组是#34;扁平"到列表,所以该行相当于

my %hash = qw( somevalue hello world );

您需要一个数组引用来创建内部数组:

my %hash = ( 'somevalue' => \@somearray);

答案 2 :(得分:0)

所以你想创建一个数组数据结构的哈希。像这样的东西也会起作用。

my $variable = "hello,world";

my @somearray = split(',',$variable);

my %hash;
#my %hash = ( 'somevalue' => @somearray);
push (@{$hash{'somevalue'}},@somearray);  #Storing it in a hash of array

foreach my $key ( keys %hash ) {
    print $key;
    foreach my $value ( @{$hash{$key}} ) {
        print $value; #the value is not being read/printed
    }
}