我尝试将数组分配给哈希值中的值,如下所示:
$authors->[$x]->{'books'} = @books;
$authors
是一个哈希数组,其中包含他/她的名字,姓氏,出生日期等。现在,我正在创建{{1}我要分配书籍数组的关键字。但是,当我尝试打印后,它只是打印数组的大小,就好像我正在做books
。
我做错了什么?
答案 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
的元素。
这可能更多"万无一失"然后使用引用,如
如上所述。