在Perl中,为什么在尝试使用字符串eval时会出现语法错误?

use*_*033 1 string syntax perl eval

为什么这不起作用?

eval "$response = $ua->request($r);"
print "$@";
Run Code Online (Sandbox Code Playgroud)

得到:

syntax error at (eval 8) line 1, near "=" 
Run Code Online (Sandbox Code Playgroud)

Bra*_*ert 22

一个更好的问题是为什么你使用字符串eval而不是块eval?

eval { $response = $ua->request($r); }
print "$@";
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,用"eval或do"结构来捕获这个例子:eval {blah; 1}或做{警告'Eval失败:$ @"}; (2认同)

cha*_*aos 15

它不起作用,因为你的双引号字符串会受到插值的影响,这种情况不会很好,这些变量会在适当的位置进行扩展.而且你需要在你的eval外面加一个分号,而不是在你的内部.尝试使用单引号:

eval '$response = $ua->request($r)';
Run Code Online (Sandbox Code Playgroud)

  • 为什么不花括号? (3认同)
  • 虽然已经回答,但重要的是要注意,正如前一位评论者所提到的那样,可能通过下文提到的封锁逃避来实现的串联躲避是可疑的.请修改你的答案,以免我们开始提倡使用stry evals. (2认同)
  • 我不认为我应该修改我的答案,因为布拉德吉尔伯特有一个非常好的替代选择,但我确实想说我不是在提倡串行的证据; 我只是想纠正OP代码中的直接的语法缺陷,Gilbert先生解决了战术上的缺陷. (2认同)
  • 答案**应该是接受的答案.它实际上回答了这个问题.虽然我的答案,只是指出另一种选择. (2认同)