>perl -e '$_ = q(t b[\)sizeof];); s/(t?(\w)(?:\s(\w))?\s(\w)(\[([^\]]+)\]))/eval $1/e'
Bareword found where operator expected at (eval 1) line 1, near ")sizeof"
(Missing operator before sizeof?)
Run Code Online (Sandbox Code Playgroud)
这是合法的Perl,那么为什么会出现错误信息?我有最新的Perl.
这是一个SSCCE; 减少任何一个字符,并且不显示错误消息.
Perl代码有效,但您正在尝试eval使用无效Perl代码的字符串.当我运行此代码并交换eval时print,它会打印字符串:
t b[)sizeof]
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试将其作为Perl代码运行,我得到:
> perl -we't b[)sizeof]'
Bareword found where operator expected at -e line 1, near ")sizeof"
(Missing operator before sizeof?)
Unquoted string "sizeof" may clash with future reserved word at -e line 1.
syntax error at -e line 1, near "[)"
Execution of -e aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
(你应该总是使用警告-w,即使是单行)
此代码完全符合您的评估尝试:它尝试将该字符串作为Perl代码运行,并且它失败,因为该字符串不是有效的Perl代码.
此外,您在使用时应该小心eval,因为它可能会给您的计算机带来意外和灾难性的事情.通常,这种双重评估是使用两个/e修饰符编写的,例如:
s/.../.../ee
Run Code Online (Sandbox Code Playgroud)
哪个比方便一点
s/.../eval .../e
Run Code Online (Sandbox Code Playgroud)