我如何重新定义';打开';正确使用Perl?
不久前,我问了一个问题: 这些答案对我很有用。我有一个包,它覆盖了Perl的“open”函数,使我能够记录文件访问 现在我遇到了一个破坏原始代码功能的案例我如何重新定义';打开';正确使用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
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);