Perl:将数组分配给哈希
Posted
技术标签:
【中文标题】Perl:将数组分配给哈希【英文标题】:Perl: Assigning an array to a hash 【发布时间】:2011-07-20 01:56:55 【问题描述】:此语法有效:
$b"x" = [1,2,3];
pp %b;
# Displays ("x", [1, 2, 3])
但我需要能够动态创建数组的内容并在以后分配它。这不起作用; 帮助,我缺少什么明显的部分?
@a = [1,2,3];
$b"x" = @a;
pp %b;
# Shows up as ("x", 1) ... not what I want or expected.
也尝试了这些变化。
$b"x" = [@a]; # ("x", [[1, 2, 3]]) ...close
$b"x" = \@a; # ("x", [[1, 2, 3]])
$b"x" = [\@a]; # ("x", [[[1, 2, 3]]])
$b"x" = %a; # ("x", 0)
$b"x" = $a; # ("x", undef)
$b"x" = [$a]; # ("x", [undef])
$b"x" = @@a; # ("x", 0)
而且,理想情况下,我希望能够稍后将数组作为数组取出。
【问题讨论】:
我的“漂亮打印”功能来自 CPAN -- 使用 Data::Dump qq/pp/; 【参考方案1】:您缺少的部分是 @a = [1,2,3]
不会创建包含 3 个元素的数组。它使用一个元素创建一个数组,该元素是一个 arrayref。
你的意思是@a = (1,2,3)
。
要将该数组分配给哈希元素,您可以使用$b"x" = [@a]
或$b"x" = \@a
,具体取决于您要执行的操作。 [@a]
创建一个新的 arrayref,其中包含 @a
的当前内容的副本。如果之后@a
的内容发生变化,对$bx
没有影响。
另一方面,\@a
为您提供了对 @a
本身的引用。如果您随后更改了@a
的内容,那么这将在$bx
中可见(反之亦然)。
【讨论】:
谢谢,我一直盯着方括号看括号。【参考方案2】:您需要阅读有关参考的perlref 文档。
数组的存储方式有所不同:
# this is an array in an array variable
@a = (1, 2, 3);
将引用存储到数组的诗句:
# this is an array in a scalar variable stored as a reference to the previous array:
$b = \@a;
在功能上就像一个指针。因此,您也可以将此引用存储在哈希中:
$x'something' = \@a;
这一切都很好。您没有意识到的是 []s 创建了对数组的references,您不能将其存储在数组变量中。您必须将其存储在标量中。因此改为:
$c = [1, 2, 3];
$x'else' = $c;
会起作用的。
在进行第二次赋值之前访问和修改数组可以使用:
$c->[3] = '4';
或以数组形式使用它首先解除引用
push @$c, 5;
【讨论】:
【参考方案3】:您的示例帮助我处理哈希。在我的代码中结束:
# Following is confusing as hell. We look to store in the hash an array reference.
# But must convert back and fort via an scalar, since actual arrays returned
# from an hash are copies in perl. i.e. my @a = $lists$e; will not work.
my $a = $lists$e;
if(!$a)$a=();$lists$e = \@$a;
push @$a, $v;
非常感谢。 会
【讨论】:
以上是关于Perl:将数组分配给哈希的主要内容,如果未能解决你的问题,请参考以下文章