/ / Perl масив ініціалізується неправильно - масиви, perl

Масовий Perl ініціалізувався неправильно - масиви, perl

Просто починаючи з Perl, я використовував неправильну пару круглих дужок для цього прикладу коду:

@arr = {"a", "b", "c"};
print "$_n" foreach @arr;

Я маю на увазі, я, звичайно, бачу, що це робить, коли я його запускаю, але я не розумію, ЧОМУ це робить. Не треба, що просто не вдається з синтаксичною помилкою?

Відповіді:

3 для відповіді № 1

Ви випадково створили анонімний хеш, який є хеш, який не має ідентифікатора і доступний лише за посиланням.

Масив @arr встановлено на одиничний елемент, який є посиланням на цей хеш. Правильно написаний це буде виглядати так

use strict;
use warnings;

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

print "$_n" foreach @arr;

саме тому ви отримали вихід

HASH(0x3fd36c)

(або щось подібне), тому що це означає, що Perl буде представляти хеш-посилання як рядок.

Якщо ви хочете експериментувати, то ви можете роздрукувати значення першого хеш-елемента за допомогою $arr[0] як хеш-посилання (масив має лише один елемент у нульовому індексі) та доступ до значення елемента за допомогою ключа a з print $arr[0]->{a}, "n".

Зауважте, що оскільки хеш повинен мати кілька значень (набір пар ключ / значення), хеш у вашому власному коді неявно розширюється до чотирьох значень, додавши undef до кінця.

це є життєво важливий що ви додаєте use strict і use warnings до вершини кожної програми Perl, яку ви пишете. У цьому випадку останнє б підняло попередження

Odd number of elements in anonymous hash

3 для відповіді № 2

Можна здивувати те, наскільки мало значення є синтаксичні помилки в Perl. У цьому випадку ви наткнулися на синтаксис для створення анонімного посилання на хеш: { LIST }. Perl не вимагає використання дужок ( () kind) при ініціалізації масиву1. Масиви зберігають упорядковані списки скалярних (одиничних) значень та посилань - скаляри, так що perl ініціалізує ваш масив за допомогою цього посилання як єдиний елемент.

Це не те, що ти хотів, але це абсолютно правильно Perl.

The () перевизначає перевагу операторів і тим самим змінює поведінку виразу. @a = (1, 2, 3) робить те, що ви очікуєте, але @a = 1, 2, 3 засоби (@a = 1), 2, 3, тому він призначає лише 1 до @a.


2 для відповіді № 3

{ LIST } є хеш-конструктором. Він створює хеш, присвоює результат LIST до нього, і повертає посилання на це.

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

Список одного хеш-рефу так само легітимно, як і будь-який інший список, так ні, це не повинно бути синтаксичною помилкою.