Perl 为什么可以';t I覆盖核心::用@而不是$\u0、$\u1、$\u2]打开?

Perl 为什么可以';t I覆盖核心::用@而不是$\u0、$\u1、$\u2]打开?,perl,overriding,Perl,Overriding,在尝试重写PERL CORE::open函数时,我尝试了以下简单的测试用例: BEGIN { *CORE::GLOBAL::open = sub { if (defined $_[2]) { CORE::open $_[0], $_[1], $_[2]; } else { CORE::open $_[0], $_[1]; } } 为什么不使用"工作"? BEGIN { *CORE::GLOBAL::open = sub { CORE::open @_

在尝试重写PERL CORE::open函数时,我尝试了以下简单的测试用例:

BEGIN {
  *CORE::GLOBAL::open = sub {
  if (defined $_[2]) {
    CORE::open $_[0], $_[1], $_[2];
  } else {
    CORE::open $_[0], $_[1];
  }
}
为什么不使用"工作"?

BEGIN {
  *CORE::GLOBAL::open = sub {
    CORE::open @_;
  }
}
我得到:

无法使用字符串(“3”)作为符号引用,而“严格引用”

我重写函数的目的是在调用open时打印堆栈跟踪(上面的代码段中未显示)

请注意,open是用三参数形式调用的,但我想概括一下override方法,这样我就不需要测试特定数量的参数,也就是说,我不需要知道需要多少参数

my $fh;
open $fh, ">", "tmp.dummy" ;

与大多数运算符的操作数一样,
open
的操作数在标量上下文中求值。

因为原型。此外,如果要覆盖open,还需要在新的匿名sub中指定正确的原型。还应测试@的大小,未定义。并处理更多参数。别忘了1-arg打开:)