/ / 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 не изисква използването на скоби ( () вид) при инициализиране на масив1, Масивите държат подредени списъци със скаларни (единични) стойности и референциите са скалари, така че perl щастливо инициализира масива ви с тази референция като единствен елемент.

Това не е това, което вие сте издирва се, но това е напълно валиден Perl.

Най- () пренебрегва предимството на операторите и по този начин променя поведението на израза. @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

Списъкът с един хеш реф е също толкова легитимен, колкото и всеки друг списък, така че не, не трябва да е грешка в синтаксиса.