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

Mar*_*eck 0 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?)
Run Code Online (Sandbox Code Playgroud)

这是合法的Perl,那么为什么会出现错误信息?我有最新的Perl.

这是一个SSCCE; 减少任何一个字符,并且不显示错误消息.

TLP*_*TLP 6

Perl代码有效,但您正在尝试eval使用无效Perl代码的字符串.当我运行此代码并交换evalprint,它会打印字符串:

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)