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

Arrays Perl-将数组分配给另一个变量,arrays,hash,perl,Arrays,Hash,Perl,我正在尝试将数组分配给哈希中的值,如下所示: $authors->[$x]->{'books'} = @books; $authors是一个哈希数组,其中包含他/她的名字、姓氏、出生日期等。现在,我正在创建一个books键,希望在其中分配一个books数组。然而,当我试图在后记中打印它时,它只是打印数组的大小,就好像我在做$value=scalar@books一样 我做错了什么?数组元素和散列值都是标量,所以在嵌套数组和散列时,必须使用引用。正如$authors->[$x]不是散列

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

$authors->[$x]->{'books'} = @books;
$authors是一个哈希数组,其中包含他/她的名字、姓氏、出生日期等。现在,我正在创建一个books键,希望在其中分配一个books数组。然而,当我试图在后记中打印它时,它只是打印数组的大小,就好像我在做$value=scalar@books一样


我做错了什么?

数组元素和散列值都是标量,所以在嵌套数组和散列时,必须使用引用。正如$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;
因为=运算符的左操作数是一个散列值,它是一个标量,所以右操作数在标量上下文中求值,以提供可以在那里赋值的内容

附言


在重读这个答案时,我意识到说散列值是标量可能会令人困惑,因为散列值可能被解释为表示散列变量的值,即整个散列。当我写散列值时,我指的是作为值而不是键存储在散列中的项。

数组元素和散列值是标量,因此当嵌套数组和散列时,必须使用引用。正如$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;
因为=运算符的左操作数是一个散列值,它是一个标量,所以右操作数在标量上下文中求值,以提供可以在那里赋值的内容

附言


在重读这个答案时,我意识到说散列值是标量可能会令人困惑,因为散列值可能被解释为表示散列变量的值,即整个散列。当我写散列值时,我指的是作为值而不是键存储在散列中的项。

虽然第一个值是绝对正确的, 作为替代方案,您还可以:

push @{$authors->[$x]->{'books'}}, @books;
然后$authors->[$x]->{'books'}将是一个数组,其中包含所有 来自@books的元素。 这可能比使用引用更简单,如
上面提到过。

虽然第一个awnser是绝对正确的, 作为替代方案,您还可以:

push @{$authors->[$x]->{'books'}}, @books;
然后$authors->[$x]->{'books'}将是一个数组,其中包含所有 来自@books的元素。 这可能比使用引用更简单,如
如上所述。

谢谢!成功了。引用原始数组方法与引用副本方法之间有什么区别?引用是什么意思?这与C中的相同吗?@Ricky[@books]您可以调用[]匿名数组构造函数获取@books并生成一个副本,该副本可以匿名保存作为引用。使用\@books,您指的是原始数组。如果您更改了任何元素,这将产生不同的效果,例如,它是否更改了副本或引用以及原件?见和。有许多方便的指南/博客文章比较:-@Ricky启动或调试器并尝试:my@test1=qw/q w e r t y/;我的$test2=\@test1;我的$test3=[@test1]。然后从$test2和$test3数组引用中弹出一个元素,看看它是如何影响@test1的。谢谢!成功了。引用原始数组方法与引用副本方法之间有什么区别?引用是什么意思?这与C中的相同吗?@Ricky[@books]您可以调用[]匿名数组构造函数获取@books并生成一个副本,该副本可以匿名保存作为引用。使用\@books,您指的是原始数组。如果您更改了任何元素,这将产生不同的效果,例如,它是否更改了副本或引用以及原件?见和。有许多方便的指南/博客文章比较:-@Ricky启动或调试器并尝试:my@test1=qw/q w e r t y/;我的$test2=\@test1;我的$test3=[@test1]。然后从$test2和$test3数组引用中弹出一个元素,看看它是如何影响@test1的。是的,你是对的,它与$authors->[$x]->{'books'}=[@books]相同;参考一份副本。是的,你是对的,它和$authors->[$x]->{'books'}=[@books]一样;参考一份副本。我的坏,应该好好看看另一个。