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

Ric*_*cky 1 arrays perl hash perl5

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

$authors->[$x]->{'books'} = @books;
Run Code Online (Sandbox Code Playgroud)

$authors是一个哈希数组,包含他/她的名字,姓氏,出生日期等.现在我正在创建一个books键,我想分配一系列书籍.但是,当我尝试打印后,它只是打印数组的大小,就像我正在做的那样$value = scalar @books.

我究竟做错了什么?

小智 8

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

$authors->[$x]->{'books'} = \@books; # reference the original array
$authors->[$x]->{'books'} = [@books]; # reference a copy
Run Code Online (Sandbox Code Playgroud)

然后,您将使用类似的方式访问数组的元素

$authors->[$x]->{'books'}->[0]
Run Code Online (Sandbox Code Playgroud)

可以缩写

$authors->[$x]{books}[0]
Run Code Online (Sandbox Code Playgroud)

或访问整个数组

@{$authors->[$x]{books}}
Run Code Online (Sandbox Code Playgroud)

你最初的尝试

$authors->[$x]->{'books'} = @books;
Run Code Online (Sandbox Code Playgroud)

完全等同于

$authors->[$x]->{'books'} = scalar @books;
Run Code Online (Sandbox Code Playgroud)

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

PS

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