我如何重新定义';打开';正确使用Perl?

我如何重新定义';打开';正确使用Perl?,perl,built-in,redefine,Perl,Built In,Redefine,不久前,我问了一个问题: 这些答案对我很有用。我有一个包,它覆盖了Perl的“open”函数,使我能够记录文件访问 现在我遇到了一个破坏原始代码功能的案例 use strict; use warnings; use Data::Dumper; sub myopen (*;@) { my $p; my $retval = CORE::open($p, $_[1]); { no strict; *{"main::$_[0]"} = $p; } return $r

不久前,我问了一个问题:

这些答案对我很有用。我有一个包,它覆盖了Perl的“open”函数,使我能够记录文件访问

现在我遇到了一个破坏原始代码功能的案例

use strict;
use warnings;
use Data::Dumper;

sub myopen (*;@) {
  my $p;
  my $retval = CORE::open($p, $_[1]);
  {
    no strict;
    *{"main::$_[0]"} = $p;
  }
  return $retval;
}

BEGIN {
  *CORE::GLOBAL::open = *myopen;
};

my @a = (1, 2, 3);

open(CHECK, ">dump") or print "UNABLE TO OPEN DUMPER FILE: $!\n";
print CHECK "test\n";
print CHECK Data::Dumper->Dump(\@a);
close CHECK
现在我得到了这个信息:

Can't locate object method "CHECK" via package "Data::Dumper"
如何修复它?

比较:

> perl -MData::Dumper -e'local*_=*STDOUT;print _ Data::Dumper->Dump([2]);'
Can't locate object method "_" via package "Data::Dumper" at -e line 1.


我使用了与“STDOUT”不同的名称,因为它似乎只有在间接对象不是内置句柄时才会出错。

尝试使用“CHECK”以外的名称。

“CHECK”是一个在编译时调用的特殊函数,您确实不应该使用它

$ open CHECK , '<', 'foo.txt'; 
Took 0.00224494934082031 seconds.

Runtime error: Undefined subroutine &Devel::REPL::Plugin::Packages::DefaultScratchpad::CHECK called at (eval 329) line 5.

$ open CHECKS , '<', 'foo.txt'; 
Took 0.00155806541442871 seconds.

$
此外,您正在使用全局文件句柄,这是有问题的

使用此符号:

open my $fh, '<' , $foo ; 
print <$fh>;
close $fh;

打开我的$fh,“这将起作用,并且不会产生错误

 print {*CHECK} Data::Dumper->Dump(\@a);
这就停止了它的困惑,它有一个


不过,我建议不要使用CHECK和其他方法,而使用词汇变量作为文件句柄是首选方法

如果这是完全的错误,那么它在错误的对象上使用了Indirect对象语法。尝试检查->打印(…),看看是否会出现相同的错误。+1,对问题进行了很好的分析,并提出了正确的解决方案(open()的saner 3-arg语法,filehandle位于词法变量中)。而且,我讨厌PERL这样的东西。@j_random_hacker:使用PerlCritic会带回一些PERL的爱;-)@draegtun:Perl::Critic看起来很有趣(尽管我担心它会对我庞大的旧代码库说些什么…:)
open my $fh, '<' , $foo ; 
print <$fh>;
close $fh;
 print {*CHECK} Data::Dumper->Dump(\@a);