【问题标题】:Perl array initialized incorrectlyPerl 数组初始化不正确
【发布时间】:2014-08-07 04:16:34
【问题描述】:

刚从 Perl 开始,我在这个代码示例中使用了错误的括号:

@arr = {"a", "b", "c"};
print "$_\n" foreach @arr;

我的意思是,当我运行它时,我当然可以看到它做了什么,但我不明白它为什么会这样。这不应该只是因为语法错误而失败吗?

【问题讨论】:

  • 欢迎使用 perl。始终在每个 perl 脚本的顶部包含 use strict;use warnings;。在这种情况下,您会收到警告 Odd number of elements in anonymous hash,这也可能提示您输入错误。
  • @Miller:除非 OP 添加了第四个元素,否则 perl 会静默进行。
  • @Miller:并且 always 拼写它 Perl ;)
  • @Borodin:除非你在谈论解释器(就像我一样)。 :) stackoverflow.com/questions/72312/how-should-i-capitalize-perl
  • @Borodin,如果您指的是程序/可执行文件,“perl”是正确的。

标签: arrays perl


【解决方案1】:

你不小心创建了一个匿名哈希,这是一个没有标识符并且只能通过引用访问的哈希。

数组@arr 设置为单个元素,该元素是对该哈希的引用。写得好应该是这样的

use strict;
use warnings;

my @arr = (
  {
    a => "b",
    c => undef,
  }
);

print "$_\n" foreach @arr;

这就是你得到输出的原因

HASH(0x3fd36c)

(或类似的东西)因为这是 Perl 将哈希引用表示为字符串的方式。

如果你想进行实验,那么你可以通过使用$arr[0] 作为哈希引用(数组在索引零处只有一个元素)并使用键访问元素的值来打印第一个哈希元素的值aprint $arr[0]->{a}, "\n"

请注意,由于哈希值必须是两个值的倍数(一组键/值对),因此您自己的代码中的哈希值通过在末尾添加 undef 隐式扩展为四个值。

use strictuse warnings 添加到您编写的每个Perl 程序的顶部至关重要。在这种情况下,后者会提出警告

Odd number of elements in anonymous hash

【讨论】:

  • 谢谢。您的回答还解释了为什么 @arr 仍然是一个数组,即使它被初始化为哈希。
  • 它没有被初始化为哈希。 1) 正如我所解释的,{} 返回一个标量,您绝对可以将一个标量列表分配给一个数组。 (例如my @a = ('a');)2)分配给哈希是错误的。
【解决方案2】:

令人惊讶的是,Perl 中几乎没有语法错误。在这种情况下,您偶然发现了创建匿名哈希引用的语法:{ LIST }。 Perl 在初始化数组1 时不需要使用括号(() 类型)。数组包含标量(单个)值的有序列表,并且引用是标量,因此 perl 很乐意将该引用作为唯一元素初始化您的数组。

这不是您想要的,但它是完全有效的 Perl。

() 覆盖运算符的优先级,从而改变表达式的行为。 @a = (1, 2, 3) 符合您的预期,但@a = 1, 2, 3 表示(@a = 1), 2, 3,因此它只将1 分配给@a

【讨论】:

  • @ikegami:我一直在努力寻找一个微妙点的措辞,但失败了。 :( 我已恢复您的编辑。
【解决方案3】:

{ LIST } 是哈希构造函数。它创建一个哈希,将LIST 的结果分配给它,并返回一个对它的引用。

my $h = {"a", "b", "c", "d"};
say $h->{a};  # b

一个哈希引用的列表与任何其他列表一样合法,所以不,它不应该是语法错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多