Как напечатать хэш-имя в Perl?
Вроде бы простой вопрос, но он ставит меня в тупик, и google просто вводит меня в заблуждение. Все, что я хочу сделать, это распечатать имя хэша. Например:
&my_sub(%hash_named_bill);
&my_sub(%hash_named_frank);
sub my_sub{
my $passed_in_hash = shift;
# do great stuff with the hash here
print "You just did great stuff with: ". (insert hash name here);
}
Часть, которую я не знаю, - это как получить материал в скобках (вставка...). Для вложенного хэша вы можете просто использовать тег "keys", чтобы получить имена хэшей (если вы хотите называть их так). Я не могу понять, как получить полное хэш-имя, хотя, похоже, это действительно просто еще один ключ.
4 ответов:
Как сказал @hackattack в комментарии, технический ответ на ваши вопросы можно найти в ответе на Get variable name as string in Perl
Однако вам следует подумать, правильно ли вы поступаете?
Если вам каким-то образом нужно знать имя хэша, вы , скорее всего, решите эту проблему лучше, если вы спрячете эти множественные хэши в хэш-хеш с именами, являющимися ключами (с которыми вы должны быть знакомы, как вы намекнули на хеш-хеш). подход в вашем вопросе).
$hash_named_bill{name} = "bill"; $hash_named_frank{name} = "frank"; &my_sub(\%hash_named_bill); &my_sub(\%hash_named_frank); sub my_sub{ my $passed_in_hash = shift; # do great stuff with the hash here print "You just did great stuff with: ". $passed_in_hash->{name}; }
Вы можете использовать имя для ссылки на хэш, но сами хэши не имеют имен. Например, рассмотрим следующее:
*foo = {}; *bar = \%foo; $foo{x} = 3; $bar{y} = 4;Имея в виду, что хэш содержит
(x=>3, y=>4): является ли хэш безымянным? по имени "фу"? называется "бар"? Все вышеперечисленное? Ничего из вышеперечисленного?Лучшее, что вы можете сделать, это приблизительный ответ, используя PadWalker. Я рекомендую не использовать его или подобное (то есть все, что находит название) в производстве!
Хэш-это просто фрагмент памяти, с которым может быть связано имя (или несколько имен).
Если вы хотите напечатать имя переменной, это не очень просто (см. комментарий haccattack) и не очень хорошо пахнет (вы уверены, что вам это действительно нужно?)
Вы также можете (если это соответствует вашему сценарию) рассмотреть "мягкие (или символические) ссылки":
%hash1 = ( x => 101, y => 501); %hash2 = ( x => 102, y => 502); my_sub("hash1"); #my_sub(\%hash1); # won't work my_sub("hash2"); sub my_sub { my $hashname = shift; print "hash name: $hashname\n"; print $hashname->{x} . "\n"; }Здесь вы передаете функции имя переменной, а не (жесткую) ссылку на нее. Уведомление что в Perl это эквивалентно в момент разыменования (попробуйте раскомментировать
my_sub(\%hash1);), хотя это совсем другое дело.
Comments