gpt4 book ai didi

perl - 为什么使用间接对象调用 `system` 只会在 autodie 中给出语法错误

转载 作者:行者123 更新时间:2023-12-02 06:27:06 24 4
gpt4 key购买 nike

Perl 的 system函数允许间接对象。在这种情况下,
间接对象​​是要运行的程序,允许argv[0]成为
不同于可执行文件的名称。

所以我可以

system {"echo"} qw(echo foo);

但是,当我使用 autodie :
use autodie qw(:all);
system {"echo"} qw(echo foo);

我明白了
syntax error at - line 2, near "} qw(echo foo)"

为什么会这样?

最佳答案

system 运算符具有三种语法。

system LIST
system $SCALAR LIST
system BLOCK LIST

(与间接方法调用或对象没有任何关系。)
autodie替换 system 的使用调用具有相同名称的子的运算符(operator)。订阅者可以提供 system LIST语法和 system BLOCK LIST语法(通过使用 prototpye),但不能同时使用两者。

$ perl -e'
CORE::say defined(prototype("CORE::system"))
? "Syntax can be emulated by subs."
: "Syntax can\x27t be emulated by subs."
'
Syntax can't be emulated by subs.

因此, system $SCALAR LIST 的不太常用的语法和 system BLOCK LIST autodie 替换 system 时不可用.这是 documented .

Applying autodie to system or exec causes the exotic forms system { $cmd } @args or exec { $cmd } @args to be considered a syntax error until the end of the lexical scope. If you really need to use the exotic form, you can call CORE::system or CORE::exec instead, or use no autodie qw(system exec) before calling the exotic form.

关于perl - 为什么使用间接对象调用 `system` 只会在 autodie 中给出语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56097825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com