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?这里发生了其他事情吗?
autodie
通过导出open
Perl 用来支持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
操作者不能由子被精确地复制。这解释了观察到的差异。
prototype("CORE::opname")
对于此类运算符,返回 undefined,但prototype("CORE::open")
不准确地报告 thatopen
的解析规则与*;$@
原型等效。