为什么我不能用@_而不是$ _ [0],$ _ [1],$ _ [2]覆盖CORE :: open?

时间:2015-11-04 02:47:21

标签: perl override

在尝试覆盖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" ;

1 个答案:

答案 0 :(得分:1)

像大多数运营商一样'操作数,open的操作数在标量上下文中进行评估。