我正在维护旧的 Perl 代码,需要在所有模块中启用严格的编译指示。我在传递文件句柄作为模块和潜艇之间的引用时遇到问题。我们有一个公共模块负责打开作为 typeglob 引用传递的日志文件。在其他模块中,run 函数首先从 common 模块调用 open_log(),然后将这个文件句柄传递给其他 subs。
在这里,我编写了一个简单的测试来模拟这种情况。
#!/usr/bin/perl -w
use strict;
$::STATUS_OK = 0;
$::STATUS_NOT_OK = 1;
sub print_header {
our $file_handle = @_;
print { $$file_handle } "#### HEADER ####"; # reference passing fails
}
sub print_text {
my ($file_handle, $text)= @_;
print_header(\$file_handle);
print { $$file_handle } $text;
}
sub open_file_handle {
my ($file_handle, $path, $name) = @_;
my $filename = $path."\\".$name;
unless ( open ($$file_handle, ">".$filename)) {
print STDERR "Failed to open file_handle $filename for writing.\n";
return $::STATUS_NOT_OK;
}
print STDERR "File $filename was opened for writing successfully.\n";
return $::STATUS_OK;
}
my $gpath = "C:\\Temp";
my $gname = "mylogfile.log";
my $gfile_handle;
if (open_file_handle(\$gfile_handle, $gpath, $gname) == $::STATUS_OK) {
my $text = "BIG SUCCESS!!!\n";
print_text(\$gfile_handle, $text);
print STDERR $text;
} else {
print STDERR "EPIC FAIL!!!!!!!!\n";
}
Main 函数首先调用open_file_handle
并将文件句柄引用传递给该print_text
函数。如果我注释掉该行:
print_header(\$file_handle);
一切正常,但我需要将文件句柄引用从函数传递给其他函数print_text
,这不起作用。
我是一名 Java 开发人员,Perl 的引用处理对我来说并不熟悉。我不想更改open_log()
sub 以返回文件句柄(现在它只返回状态),因为我有很多模块和数百行代码行要在所有地方进行此更改。
如何修复我的代码以使其正常工作?