肯特的回答虽然在技术上是正确的,但没有抓住重点。解决的办法不是eval
更好用,而是根本不用eval
!
这个问题的症结似乎在于理解是什么eval STRING
(eval BLOCK
尽管名称相同,但它是完全不同的)。它接受一个字符串并将其作为 Perl 代码运行。99.99% 这是不必要的和危险的,会导致意大利面条代码,你绝对不应该在你的 Perl 编程生涯的早期使用它。你在你爸爸的袜子抽屉里找到了枪。发现它可以在你现在试图用它挂海报的东西上打洞。最好忘记它的存在,你的代码会更好。
$x = eval($ENV{EDITOR});
不做你认为它做的事。我什至不必知道你认为它做了什么,你甚至在那里使用它意味着你不知道。我也知道你是在关闭警告的情况下运行的,因为 Perl 会因此而对你大喊大叫。为什么?假设EDITOR
设置为/bin/vi
. 以上等价于$x = /bin/vi
which 甚至不是有效的 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.
我不确定你最初是如何让它工作的。我怀疑你在你的例子中遗漏了一些东西。也许调整 EDITOR 直到它起作用?
您不必做任何神奇的事情来读取环境变量。只是$x = $ENV{EDITOR}
。完毕。 $x
现在/bin/vi
如你所愿。它只是一样$x = $y
。与 QUOTE 相同。
$ QUOTE=\' perl -wle '$x=$ENV{QUOTE}; print $x'
'
完毕。
现在,我怀疑您真正想要做的是运行该编辑器并在某些 shell 命令中使用该引号。我对吗?