Как я могу использовать значение переменной в качестве имени переменной в Perl?

Если у меня есть переменная, $bar, который равен строке "foo" а также $foo равно 0xdead, как я могу получить $fooзначение в то время как у меня есть только строка для имени переменной?

По сути, я хочу сделать своего рода указатель на глобальное пространство имен или поиск хеша в глобальном пространстве имен.

Следующее не сработало:

perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

Он печатает только перевод строки.

3 ответа

Решение

Этот прием работает только с глобальными переменными (символьные ссылки ищут таблицу символов текущего пакета), т.е.

perl -e '$foo=0xdead; my $bar ="foo"; print ${$bar}."\n";' 

Если вы хотите поймать лексику, вам придется использовать eval ""

perl -e 'my $foo=0xdead; my $bar ="foo"; print eval("\$$bar"),"\n";' 

Но используя eval "" без цели считается плохим стилем в Perl, а также с использованием глобальных переменных. Подумайте об использовании реальных ссылок (если вы можете).

В Perl очень, очень, очень, очень мало примеров, когда вы должны использовать символические ссылки. Избегать символических ссылок во всех других случаях - это не стиль. Речь идет о том, чтобы быть умным программистом. Как объясняет mjd в разделе " Почему глупо использовать переменную как имя переменной":

Настоящий корень проблемного кода: он хрупкий. Вы смешиваетесь в отличие от вещей, когда вы делаете это. И если две из этих непохожих вещей получат одно и то же имя, они столкнутся, и вы получите неправильный ответ. Таким образом, вы получите целый длинный список имен, который вы должны быть осторожны, чтобы не использовать его повторно, и если вы облажаетесь, вы получите очень странную ошибку. Это как раз та проблема, для решения которой были изобретены пространства имен, и именно в этом и заключается хеш: переносимое пространство имен.

Смотрите также часть 2 и часть 3.

Без my и с $$bar работает для меня:

$ perl -e '$ foo = 0xdead; $ bar = "foo"; напечатать $$bar."\n";'
57005

Вы можете узнать больше об использовании переменной в качестве имени переменной в Perl FAQ List.

Другие вопросы по тегам