Perl 为什么所有这些访问数组的方法都有效?

Perl 为什么所有这些访问数组的方法都有效?,perl,hash,arrays,Perl,Hash,Arrays,在我看来,其中一些应该失败,但它们都输出了它们应该输出的内容: $, = "\n"; %test = ( "one" => ["one_0", "one_1"], "two" => ["two_0", "two_1"] ); print @{$test{"one"}}[0], @{$test{"one"}}->[0], $test{"two"}->[0], $test{"one"}[1]; 为什么会这样?您的第一个示

在我看来,其中一些应该失败,但它们都输出了它们应该输出的内容:

$, = "\n";
%test = (
    "one" => ["one_0", "one_1"],
    "two" => ["two_0", "two_1"]
);

print @{$test{"one"}}[0],
      @{$test{"one"}}->[0],
      $test{"two"}->[0],
      $test{"one"}[1];

为什么会这样?

您的第一个示例与其他示例不同。这是一种伪装,因为你只需要一件东西

@{$test{"one"}}[0];

@{$test{"one"}}[1, 0];  # Another slice example.
其他示例是在多级数据结构中取消引用项的替代方法。但是,不推荐使用数组进行反引用(请参阅)


关于最后一个示例,相邻的两个下标之间有一个隐含的
->
。例如,请参阅关于in-perlreftut的讨论。

值得注意的是,标量上下文中的数组切片返回切片中的最后一个元素,这与逗号运算符
非常相似。因为在Perl中,有多种方法可以实现这一点。这是语言哲学的一部分。它不是统一共享的。如果其中一个或多个没有输出它应该输出的内容,您会更喜欢吗?
@{$test{"one"}}->[0]; # Deprecated. Turn on 'use warnings'.
$test{"two"}->[0];    # Valid.
$test{"one"}[1];      # Valid but easier to type.