Почему все эти методы доступа к массиву работают? - PullRequest
2 голосов
/ 19 мая 2010

Мне кажется, что некоторые из них должны потерпеть неудачу, но все они выводят то, что должны:

$, = "\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 Ответ

8 голосов
/ 19 мая 2010

Ваш первый пример отличается от других. Это фрагмент массива - но замаскированный, поскольку вы запрашиваете только один элемент.

@{$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.

Что касается последнего примера, два подписчика, сидящие рядом друг с другом, имеют подразумеваемое значение -> между ними. См., Например, обсуждение правила Arrow в perlreftut.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...