Как я могу использовать значение переменной в качестве имени переменной в Perl?
-
22-09-2019 - |
Вопрос
Если у меня есть переменная, $bar
, который равен строке "foo"
и $foo
равно 0xdead
, как я могу получить $foo
значение, в то время как у меня есть только строка для имени переменной?
По сути, я хочу выполнить своего рода косвенное обращение к указателю в глобальном пространстве имен или поиск по хешу в глобальном пространстве имен.
Следующее не сработало:
perl -e 'my $foo=0xdead; my $bar ="foo"; print ${$bar}."\n";'
Он печатает только новую строку.
Решение
Этот трюк работает только с глобальными переменными (символические ссылки ищут таблица символов текущего пакета), т.е.е.
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 очень, очень, очень мало случаев, когда вам приходится использовать символические ссылки.Избегание символических ссылок во всех остальных случаях не касается стиля.Речь идет о том, чтобы быть умным программистом.Как МЖД объясняет в Почему глупо «использовать переменную в качестве имени переменной»:
Настоящий корень проблемного кода:Это хрупкое.Когда вы это делаете, вы смешиваете разные вещи.А если две из этих непохожих вещей будут иметь одно и то же имя, они столкнутся, и вы получите неправильный ответ.В итоге у вас получается целый длинный список имен, который нужно быть осторожным, чтобы не использовать повторно, и если вы облажаетесь, то получите очень странную ошибку.Это именно та проблема, для решения которой были изобретены пространства имен, и именно этим и является хэш:Переносимое пространство имен.
Без my
и с $$bar
работает для меня:
$ perl -e '$foo=0xdead;$bar ="foo"; print $$bar."\n";' 57005
Вы можете узнать больше об использовании переменная как имя переменной в Список часто задаваемых вопросов по Perl.