Ответ Кента, хотя и технически верен, не соответствует сути. Решение не в том, чтобы использовать eval
лучше, а в том, чтобы вообще не использовать eval
!
Суть этой проблемы, кажется, заключается в понимании того, что делает eval STRING
(есть eval BLOCK
, который совершенно отличается, несмотря на то, что имеет одно и то же имя). Он принимает строку и запускает ее как код Perl . На 99,99% это не нужно и опасно, что приводит к появлению спагетти-кода, и вам абсолютно не следует использовать его на ранних этапах вашей карьеры программиста на Perl. Вы нашли пистолет в ящике с носками вашего отца. Обнаружив, что он может продуть дыры в вещах, которые вы сейчас пытаетесь использовать, чтобы повесить плакат. Лучше забыть о его существовании, ваш код будет намного лучше.
$x = eval($ENV{EDITOR});
не делает то, что вы думаете, что делает. Мне даже не нужно знать, что вы думаете, что он делает, что вы даже использовали его там, значит, вы не знаете. Я также знаю, что вы бежите с предупреждениями, потому что Perl кричал бы на вас за это. Зачем? Предположим, что EDITOR
установлено на /bin/vi
. Вышеуказанное эквивалентно $x = /bin/vi
, который даже не является допустимым кодом Perl.
$ EDITOR=/bin/vi perl -we '$x=eval($ENV{EDITOR}); print $x'
Bareword found where operator expected at (eval 1) line 1, near "/bin/vi"
(Missing operator before vi?)
Unquoted string "vi" may clash with future reserved word at (eval 1) line 2.
Use of uninitialized value $x in print at -e line 1.
Я не уверен, как ты заставил это работать в первую очередь. Я подозреваю, что вы что-то упустили из своего примера. Может быть, настроить редактор, пока он не заработал?
Вам не нужно ничего делать магическим, чтобы прочитать переменную окружения. Просто $x = $ENV{EDITOR}
. Готово. $x
теперь /bin/vi
, как вы хотели. Это так же, как $x = $y
. То же самое с цитатой.
$ QUOTE=\' perl -wle '$x=$ENV{QUOTE}; print $x'
'
Готово.
Теперь, я подозреваю, что вы действительно хотите сделать, это запустить этот редактор и использовать эту кавычку в некоторой команде оболочки. Я прав?