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

StackOverflow https://stackoverflow.com/questions/2314507

  •  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 очень, очень, очень мало случаев, когда вам приходится использовать символические ссылки.Избегание символических ссылок во всех остальных случаях не касается стиля.Речь идет о том, чтобы быть умным программистом.Как МЖД объясняет в Почему глупо «использовать переменную в качестве имени переменной»:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top