Nie ma czegoś takiego jak zwrot haszu w Perlu.
Podprogramy wziąć list jak ich argumentów i mogą wrócić list ich wyniku. Zauważ, że lista jest bardzo różnym stworzeniem z tablicy.
Kiedy piszesz
return %fileDetails;
Jest to odpowiednik:
return ('something', 0, 'somethingelse', 7.68016712043654, 'else', 'burst');
Po wywołaniu podprogramu i dostać tę listę z powrotem, jedno można zrobić, to przypisać go do nowego hash:
my %result = fileDetailsSub();
To działa, ponieważ hash można zainicjować z listy par klucz-wartość. (Pamiętaj, że (foo => 42, bar => 43)
to samo, co ('foo', 42, 'bar', 43)
.
Teraz, kiedy użyć operatora referencji backslash na hash, jak w \%fileDetails
, masz odniesienie hash który jest skalarne punkty do mieszania.
Podobnie, jeśli piszesz \@array
, masz odniesienie do tablicy.
Ale kiedy użyć operatora referencji na listy, nie dostaniesz odniesienie do wykazu (od wykazy nie są zmiennymi (są efemeryczne), nie można ich przywoływać). Zamiast tego operator odniesienia dystrybuuje ponad elementów listy, więc
\('foo', 'bar', 'baz');
sprawia, że nowa lista:
(\'foo', \'bar', \'baz');
(W tym przypadku możemy uzyskać pełną listę referencji skalarnych.) A to, co widzisz przy próbie uzyskania Dumper
wyników podprogramu: operator referencyjny rozłożony na liście pozycji zwróconych z sub.
Jednym z rozwiązań jest przypisanie listy wyników do faktycznej zmiennej hash przed użyciem Dumper.Innym jest powrót odniesienie hash (czego Dumpering tak) z sub:
return \%fileDetails;
...
my $details_ref = fileDetailsSub();
print Dumper($details_ref);
# access it like this:
my $elem = $details_ref->{something};
my %copy = %{ $details_ref };
więcej zabawy, patrz:
Odpowiedź brzmi: "\\", które mechanicznie wstawiasz do wywołań Dumper() :-) –