我在维护旧的Perl代码,并且需要在所有模块中启用严格的编译指示。在传递文件句柄作为模块和子文件之间的引用时遇到问题。我们有一个公共模块,负责打开以typeglob引用传递的日志文件。在其他模块中,运行函数首先从公共模块调用open_log(),然后将该文件句柄传递给其他子类。如何在perl中将模块和子程序之间的文件句柄作为参考传递
这里我写了一个简单的测试来模拟这种情况。
#!/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";
}
主函数首先调用open_file_handle
并传递一个文件句柄参考print_text
功能。如果我注释掉该行:
print_header(\$file_handle);
一切工作正常,但我需要通过从print_text
功能的文件句柄参考其他功能,这是行不通的。
我是Java开发人员,Perl的引用处理对我来说并不熟悉。我不想更改open_log()
子文件来返回一个文件句柄(现在它只返回状态),因为我有很多模块和数百个代码行要在所有地方进行此更改。
如何修复我的代码以使其工作?
非常感谢。 “我们”和double-deref只是我的试验,试图找出我如何使它工作。实际的错误似乎是在参数分配周围没有放置括号。我只是想了解如何在perl中引用工程。这有助于我理解其中的一些。 – edufinn 2013-05-14 09:51:30
@edufinn我很高兴它的工作原理。 :)你应该阅读我链接的教程。引用是非常强大的,也是Perl的一个组成部分。但是,标量的有点奇怪。尝试使用数据结构。使用Data :: Dumper来查看一些东西,你会更快地理解它。 – simbabque 2013-05-14 10:52:07