gpt4 book ai didi

perl - 如何在 Perl 中正确重新定义 'open'?

转载 作者:行者123 更新时间:2023-12-01 08:42:26 25 4
gpt4 key购买 nike

前段时间,我问了一个问题:How do I redefine built in Perl functions?

答案对我很有帮助。我有一个包,它覆盖 Perl 的“打开”功能,使我能够记录文件访问。

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

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"

我该如何解决?

最佳答案

尝试使用“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.

$

为什么会出现这个特定错误?

perl -MO=Deparse -e 'print CHECK Data::Dumper 1';
print 'Data::Dumper'->CHECK(1);

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

使用这个符号:

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

这些额外的好处是它们在超出范围时会自动关闭。

关于perl - 如何在 Perl 中正确重新定义 'open'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/813779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com