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:将数组分配给哈希的主要内容,如果未能解决你的问题,请参考以下文章

在php中分配给关联数组切片

将字符串数组分配给二维字符串数组

如何将 PHP 数组分配给 jQuery 数组? [复制]

将数组分配给 html 数据

如何将二维数组分配给**指针? [复制]

将一个字符数组分配给另一个会产生错误。为啥?