如何在Perl中将现有的数组用作哈希值?

3

我有一个现有的数组,希望将其作为哈希值添加。我知道可以使用数组作为值,但看不到分配现有数组的方法。我基本上想这样做:

$hash{fieldName} = @myArray;

显然,仅仅这样是不起作用的!需要帮助!


1
数据结构手册提供了许多关于处理数据结构的好信息。有大量创建、存储和访问数据的示例。http://perldoc.perl.org/perldsc.html - daotoad
4个回答

12

你只能在哈希表/数组中存储标量值。你需要使用:

$hash{fieldName} = \@myArray;

进行存储:

my @myOtherArray = @{$hash{fieldName}};

通过使用对数组的引用,绕过标量要求来获取它。


您还可以使用$hash{fieldName}[$index]访问单个元素。 - friedo
1
@friedo - 我想你的意思是$hash{fieldName}->[$index] - Joe Casadonte
@joe,不需要使用 ->。请查看 perldsc 中的示例。 - daotoad
1
@daotoad - 你说得对。然而,我从不考虑使用那种符号,因为它会让事情变得混乱(你正在访问数组引用的元素,就好像它是一个数组一样,虽然在语法上是正确的,但对于 Perl 知识较少的人来说可能会令人困惑)。假设有:my(@foo) = (1..3); my(%bar) = (a => 1, b => 2, c => 3); $bar{d} = \@foo; 那么 print "D: $bar{d}->[1]";print "D: $bar{d}[1]"; 都会输出 "D: 2"。但是这个:my($baz) = $bar{d}; print "$baz[1]"; 会产生错误,而这个是可以的:print "$baz->[1]"; - Joe Casadonte

6

既然没有人提到,那么你的代码所做的是:

  • 由于你正在对哈希表的元素进行赋值,所以赋值处于标量上下文中

  • 在标量上下文中,数组的值变为数组的大小

  • 因此,$hash{fieldName} 的值等于数组的大小 (scalar @myarray)


5
虽然正确的答案确实是存储引用,但在某些情况下,\@myArray[ @myArray ](浅拷贝)和dclone(深拷贝)之间的区别很重要。
如果您有$hash{fieldName} = \@myArray,那么$hash{fieldName}->[2]将修改@myArray的第三个元素。如果@myArray本身不包含任何引用,则存储浅拷贝将帮助您避免该行为。

4
你可以使用反斜杠运算符 '\' 来存储数组的引用,例如:
$hash{fieldName} = \@myArray

您可以使用以下内容进行访问:
@{$hash{fieldName}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接