>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?)
这是合法的Perl,那么为什么会出现错误信息?我有最新的Perl。
这是一个SSCCE;减少任何一个字符,并且不显示错误消息。
答案 0 :(得分:6)
Perl代码有效,但您尝试eval
一个无效的Perl代码字符串。当我运行此代码并为eval
交换print
时,它会打印字符串:
t b[)sizeof]
现在,如果我尝试将其作为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.
(您应该始终使用警告-w
,即使使用单行)
此代码完全符合您的评估尝试:它尝试将该字符串作为Perl代码运行,并且因为该字符串不是有效的Perl代码而失败。
使用eval
时,您应该小心,因为它可能会给您的计算机带来意外和灾难性的事情。通常,这种双重评估是使用两个/e
修饰符编写的,例如:
s/.../.../ee
哪个比
更方便s/.../eval .../e