arrays - 为什么 Perl 在声明时将哈希元素视为列表上下文?

标签 arrays perl hash

鉴于此代码:

#!/usr/bin/perl -w

use strict;
use warnings;

sub foo {
    return wantarray ? () : "value1";
}

my $hash = {
    key1 => foo(),
    key2 => 'value2'
};

use Data::Dumper;
print Dumper($hash);

我得到以下输出:

$VAR1 = {
  'key1' => 'key2',
  'value2' => undef
};

当我期望时:

$VAR1 = {
  'key1' => 'value1',
  'key2' => 'value2'
};

我知道散列是一种偶数大小的数组(正如我得到的“散列分配中的奇数个元素”警告所证明的那样),但散列元素只能是标量,为什么编译器会给它数组上下文?

我在直接分配给哈希时使用 CGI 模块的 param 函数发现了这一点。上面的 foo() 函数是对 CGI::param('mistyped_url_param') 的调用,它返回一个空数组,破坏(旋转?)哈希结构。

最佳答案

胖逗号不是特殊的哈希赋值运算符。它只是一个语法糖,意思是“自动引用以前的东西”

所以:

my $hash = {
    key1 => foo(),
    key2 => 'value2'
};

意思:

my $hash = {
    'key1', foo(), 'key2', 'value2'
};

...这是一个列表,正如 willert 所说:

every expression in a list is evaluated in list context. You can get around this by calling scalar foo()

关于arrays - 为什么 Perl 在声明时将哈希元素视为列表上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2332792/

相关文章:

java - 哈希漏洞

javascript - 使用 forEach 的 Object.entries 映射对象数组返回未定义,除非使用 console.log

c# - 在 C# 中一般访问多维数组

c++ - 此方法不适合使用 2D 坐标作为 std::unordered_map 中的键吗?

perl - 是否可以删除 PDF 中的嵌入字体并像在网页中一样从服务器中使用它们?

sql-server - 如何在数据库中插入特殊字符?

java - 检查网页是否已经下载

c - 将指向较大数组的指针分配给指向较小 VLA 的指针

将结构复制到字节数组

perl - 帮助用 Perl 构建状态机的软件