test.pl:
#!/usr/bin/perl
use warnings;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "n";
CORE::close(@Args);
};
}
use lib '.';
use Test;
Test.pm:
package Test;
open(XXX, 'test.pl');
close(XXX);
1;
当我运行这个程序(perl test.pl
(,我得到:
Use of uninitialized value $FileNO in print at test.pl line 10.
close() on unopened filehandle 1 at test.pl line 11.
错误在哪里?
您将整个@Args
数组传递到CORE::close
中,这不是文件句柄。您需要传入数组的正确元素。下面是一个从命令行获取文件名并执行正确操作的示例:
use warnings;
use strict;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "n";
# the next line is where the issue is
CORE::close($Args[0]);
};
}
die "need file param" if ! @ARGV;
my $file = $ARGV[0];
open my $fh, $file or die $!;
close $fh or die $!;
我会进一步介绍你所拥有的。首先,我将重新调整内容,以便CORE
函数的覆盖位于.pm
文件中而不是测试文件中,然后我将切换到使用词法文件句柄,因为全局裸词在这里不起作用:
Test.pm
:
package Test;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "n";
CORE::close($Args[0]);
};
}
1;
脚本文件:
use warnings;
use strict;
use lib '.';
use Test;
open my $fh, 'test.pl' or die $!;
close $fh or die $!;
在迁移代码和使用词法文件句柄之间,事情应该按预期工作。
运行脚本的输出:
3
。为了确保一切正常,我将返回到您的默认配置,其中覆盖在测试脚本中,而不是模块中:
Test.pm
package Test;
open my $fh, 'test.pl' or die $!;
close $fh or die $!;
1;
。和脚本:
use warnings;
use strict;
BEGIN {
*CORE::GLOBAL::close = sub (;*) {
my @Args = @_;
my $FileNO = fileno($Args[0]);
print $FileNO, "n";
CORE::close($Args[0]);
};
}
use lib '.';
use Test;
输出:
4