复杂的奇怪错误信息,但合法的Perl单线程

时间:2014-01-19 14:25:38

标签: perl

>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;减少任何一个字符,并且不显示错误消息。

1 个答案:

答案 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