В Perl нет такой вещи, как возвращение хэша.
Подпрограммы принимают списки в качестве своих аргументов, и они могут вернуться списки в качестве результата. Обратите внимание, что список - это совсем другое существо из массива.
Когда вы пишете
return %fileDetails;
Это эквивалентно:
return ('something', 0, 'somethingelse', 7.68016712043654, 'else', 'burst');
При вызове подпрограммы и получить этот список обратно, одна вещь, которую вы можете сделать, это назначить его на новый хэш:
my %result = fileDetailsSub();
Это работает, потому что хэш может быть инициализирован с списком пар ключ-значение. (Помните, что (foo => 42, bar => 43)
это то же самое, как ('foo', 42, 'bar', 43)
.
Теперь, когда вы используете ссылочный обратный слэш оператор на хэш, как в \%fileDetails
, вы получите хэш ссылку которая является скалярной точки на хэш.
Точно так же, если вы пишете \@array
, вы получите ссылку на массив.
Но при использовании эталонного оператора на список, вы не получите ссылку на список (так как списки не являются переменными (они эфемерны), на них нельзя ссылаться.) Вместо этого, ссылка оператор распределяет над пунктами списка, так
\('foo', 'bar', 'baz');
делает новый список:
(\'foo', \'bar', \'baz');
(В этом случае мы получаем список полный скалярных ссылок.) И это то, что вы видите при попытке выполнить Dumper
результаты вашей подпрограммы: ссылочный оператор, распределенный по списку элементов, возвращенных из вашего под.
Итак, одним из решений является назначение списка результатов фактической переменной хеширования перед использованием самосвала.Другой возвращать ссылку на хеш (то, что вы Dumpering в любом случае) из суб:
return \%fileDetails;
...
my $details_ref = fileDetailsSub();
print Dumper($details_ref);
# access it like this:
my $elem = $details_ref->{something};
my %copy = %{ $details_ref };
Для большего удовольствия, см:
Ответ в '\\', который вы механически вставляете в свои вызовы Dumper() :-) –