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

时间:2010-05-19 19:35:47

标签: 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];

为什么会这样?

1 个答案:

答案 0 :(得分:8)

你的第一个例子与其他例子不同。这是一个array slice - 但是伪装,因为你只要求一个项目。

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

@{$test{"one"}}[1, 0];  # Another slice example.

您的其他示例是在多级数据结构中取消引用项目的替代方法。但是,不推荐使用数组进行取消引用(请参阅perldiag)。

@{$test{"one"}}->[0]; # Deprecated. Turn on 'use warnings'.
$test{"two"}->[0];    # Valid.
$test{"one"}[1];      # Valid but easier to type.

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