为什么这个关于strict subs的错误只会在autodie下触发?

Eva*_*oll 3 perl warnings bareword

给定这样的代码,我不会收到任何警告。

use strict;
use warnings;
open STDERR, '>&', STDOUT;
Run Code Online (Sandbox Code Playgroud)

鉴于此代码,我收到一个致命错误。

use strict;
use warnings;
use autodie;
open STDERR, '>&', STDOUT;
Run Code Online (Sandbox Code Playgroud)

在 ./test.pl 第 6 行使用“strict subs”时不允许使用裸字“STDOUT”。由于编译错误,./test.pl 的执行中止。

为什么autodie将严格的 subs 指向这个错误的根源——在第一个例子中显然是严格的,而我没有错误。

随着diagnostics误差这样的解释..

在 ./test.pl 第 7 行使用“strict subs”时不允许使用裸字“STDOUT”。由于编译错误,./test.pl 的执行中止 (#1) (F) 使用“strict subs”时,a裸字只允许作为子程序标识符,在大括号中或在“=>”符号的左边。也许您需要预先声明一个子程序?

这都可以通过做来解决

open STDERR, '>&', *STDOUT;
Run Code Online (Sandbox Code Playgroud)

那么它不是一个裸字,但是为什么裸字是特殊的,没有autodie,而不是autodie?这里发生了其他事情吗?

ike*_*ami 8

autodie通过导出openPerl 用来支持open操作符的名为 sub 来完成它的任务。

$ perl -MO=Concise,-exec -e'             open(my $fh, "<", "foo")'
...
8  <@> open[t3] vK/3
...

$ perl -MO=Concise,-exec -e'use autodie; open(my $fh, "<", "foo")'
...
7  <#> gv[*open] s
8  <1> entersub vKS
...
Run Code Online (Sandbox Code Playgroud)

open操作者不能由一个原型被复制特殊的分析规则[1] ,因此,open操作者不能由子被精确地复制。这解释了观察到的差异。


  1. 通常,prototype("CORE::opname")对于此类运算符,返回 undefined,但prototype("CORE::open")不准确地报告 thatopen的解析规则与*;$@原型等效。