Как я могу использовать значение переменной в качестве имени переменной в 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 в разделе " Почему глупо использовать переменную как имя переменной":
Настоящий корень проблемного кода: он хрупкий. Вы смешиваетесь в отличие от вещей, когда вы делаете это. И если две из этих непохожих вещей получат одно и то же имя, они столкнутся, и вы получите неправильный ответ. Таким образом, вы получите целый длинный список имен, который вы должны быть осторожны, чтобы не использовать его повторно, и если вы облажаетесь, вы получите очень странную ошибку. Это как раз та проблема, для решения которой были изобретены пространства имен, и именно в этом и заключается хеш: переносимое пространство имен.
Без my
и с $$bar
работает для меня:
$ perl -e '$ foo = 0xdead; $ bar = "foo"; напечатать $$bar."\n";' 57005
Вы можете узнать больше об использовании переменной в качестве имени переменной в Perl FAQ List.