Как напечатать хэш-имя в 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", чтобы получить имена хэшей (если вы хотите называть их так). Я не могу понять, как получить полное хэш-имя, хотя, похоже, это действительно просто еще один ключ.

604   4  

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

    Ничего не найдено.