Tło wyjaśnienie:
split, podobnie jak inne funkcje, zwraca listę. Nie możesz odwołać się do listy. Jeśli jednak zastosujesz operator referencyjny do listy, zostanie on zastosowany do wszystkich jego członków. Na przykład:
use Data::Dumper;
my @x = \('a' .. 'c');
print Dumper \@x
wyjściowa:
$VAR1 = [
\'a',
\'b',
\'c'
];
Dlatego, kiedy piszesz my $test = \split(/,/, 'a,b,c,d,e');
, masz odniesienie do ostatniego elementu zwróconej listy (patrz, na przykład, What’s the difference between a list and an array?). Twoja sytuacja jest podobna do:
Chociaż wygląda na to, że masz listę na prawej stronie, Perl faktycznie widzi kilka skalarów oddzielone przecinkiem:
my $scalar = ('dog', 'cat', 'bird'); # $scalar gets bird
skoro "przypisanie do skalaru, prawa strona jest w kontekście skalarnym. Operator przecinka (tak, to operator!) W kontekście skalarnym ocenia swoją lewą stronę, odrzuca wynik i ocenia jego prawą stronę i zwraca wynik. W efekcie ta lista - przyporządkowuje do wartości $ skalar, która jest wartością najbardziej prawą. bałagan to wiele osób się becuase oni wybrać list-sobowtóra, którego ostatnim elementem jest również liczą się spodziewać:
my $scalar = (1, 2, 3); # $scalar gets 3, accidentally
W twoim przypadku, to co masz na RHS jest lista odniesień do elementów lista zwrócona przez split
, a ostatni element tej listy kończy się $test
. Najpierw musisz zbudować tablicę z tych zwracanych wartości i odwołać się do tego. Można zrobić, że pojedyncza wypowiedź tworząc anonimowej tablicy i przechowywania odniesienie do tego w $test
:
my $test = [ split(/,/, 'a,b,c,d,e') ];
Dlatego właśnie uwielbiam SO! Bardzo dziękuję za dokładne, cierpliwe i bardzo jasne wyjaśnienie. Teraz jest całkowicie jasne, wiele się dzisiaj nauczyłem. Dzięki! –