Как я могу использовать значение переменной в качестве имени переменной в Perl? - PullRequest
1 голос
/ 23 февраля 2010

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

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

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

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

Он печатает только новую строку.

Ответы [ 3 ]

7 голосов
/ 23 февраля 2010

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

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, как и использование глобальных переменных. Рассмотрите возможность использования реальных ссылок (если можете).

4 голосов
/ 23 февраля 2010

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

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

См. Также Часть 2 и Часть 3 .

0 голосов
/ 23 февраля 2010
У меня

Без my и с $$bar работает:

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

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

...