0

下面是我的代码(只是玩哈希),我想在其中创建数组的哈希(分配给数组的键)。但我将输出作为数组引用。为什么显示此数组引用?

 #!/usr/bin/perl
 my @result = (0,0,0);
 my @operator = ('AP', 'MP', 'UP');
 my %operator_res;

 for ( $i = 0; $i <= $#operator; $i++ ) {
     if ( $i == 2 ) {
         @result = (4,5,6);
     } elsif ( $i == 1 ) {
         @result = (1,2,3);
     }
     @{$operator_res{$operator[$i]}} = @result;
 }
 foreach $keys (%operator_res) {
     print "$keys:";
     #print "@{$operator_res{$keys}}\n";
     print "$operator_res{$keys}[0], $operator_res{$keys}[1], $operator_res{$keys}[2]\n";
 }

输出是

UP:4, 5, 6
ARRAY(0x17212e70):, ,   Why is this array reference printing?
AP:0, 0, 0
ARRAY(0x17212e00):, ,
MP:1, 2, 3
ARRAY(0x17212e20):, ,
4

4 回答 4

4
foreach $keys (%operator_res)

应该

foreach $keys (keys %operator_res)
于 2013-03-04T13:04:25.113 回答
1

您的foreach循环遍历 的每个元素%operator_res,而不仅仅是键。正如 ikagim 已经回答的那样,您必须使用keys仅获取散列的键。

如果你看一下Data::Dumper输出%operator_res是:

$VAR1 = 'UP';
$VAR2 = [
          4,
          5,
          6
        ];
$VAR3 = 'AP';
$VAR4 = [
          0,
          0,
          0
        ];
$VAR5 = 'MP';
$VAR6 = [
          1,
          2,
          3
        ];

如您所见,每个元素将始终获得两次迭代:一次用于键,一次用于数组 ref。

于 2013-03-04T13:11:16.333 回答
0

Perl 中的哈希值必须是标量。要模拟多维散列,请使用对散列或数组的引用的值。

线

@{$operator_res{$operator[$i]}} = @result;

在你的问题中相当于

$operator_res{ $operator[$i] } = [ @result ];

也就是说,此时与键关联的值$operator[$i]是对内容相同的新数组的引用@result

对于许多示例,请阅读perllol 文档

于 2013-03-04T13:04:14.337 回答
0

您可以使用 Data::Dumper 以格式良好的方式打印出您的数据:

use Data::Dumper;
print Dumper(\%operator_res);

问:为什么要打印这个数组参考?

A:因为这一行: print "$keys:";

于 2013-03-04T13:05:03.823 回答