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