Perl - 将数组分配给另一个变量

时间:2015-05-22 12:48:49

标签: arrays perl hash perl5

我尝试将数组分配给哈希值中的值,如下所示:

$authors->[$x]->{'books'} = @books;

$authors是一个哈希数组,其中包含他/她的名字,姓氏,出生日期等。现在,我正在创建{{1}我要分配书籍数组的关键字。但是,当我尝试打印后,它只是打印数组的大小,就好像我正在做books

我做错了什么?

2 个答案:

答案 0 :(得分:8)

数组元素和散列值是标量,因此在嵌套数组和散列时,必须使用引用。正如$authors->[$x]不是散列而是对散列的引用一样,您必须将$authors->[$x]->{'books'}设置为对数组的引用。

$authors->[$x]->{'books'} = \@books; # reference the original array
$authors->[$x]->{'books'} = [@books]; # reference a copy

然后,您将使用类似

的内容访问数组的元素
$authors->[$x]->{'books'}->[0]

可以缩写

$authors->[$x]{books}[0]

或以

的形式访问整个数组
@{$authors->[$x]{books}}

您最初的尝试

$authors->[$x]->{'books'} = @books;

完全等同于

$authors->[$x]->{'books'} = scalar @books;

因为=运算符的左操作数是一个散列值,这是一个标量,所以在标量上下文中计算右操作数以提供可以在那里分配的内容。

P.S。

在重读这个答案时,我意识到说“哈希值是标量”可能会令人困惑,因为“哈希值”可能解释为“哈希变量的值”,即“整个哈希值”。当我写“哈希值”时,我的意思是存储在哈希中作为值(而不是键)。

答案 1 :(得分:2)

虽然第一个芒果绝对正确, 作为替代方案,你也可以这样做:

push @{$authors->[$x]->{'books'}}, @books;

然后$authors->[$x]->{'books'}将是一个包含所有副本的数组 来自@books的元素。 这可能更多"万无一失"然后使用引用,如 如上所述。