古い Perl コードを維持しており、すべてのモジュールで厳密なプラグマを有効にする必要があります。モジュールとサブルーチン間の参照としてファイル ハンドルを渡す際に問題があります。型グロブ参照として渡されるログ ファイルを開くための共通モジュールがあります。他のモジュールでは、run 関数は最初に共通モジュールから open_log() を呼び出し、次にこのファイル ハンドルを他のサブルーチンに渡します。
ここでは、状況をシミュレートするための簡単なテストを作成しました。
#!/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()
すべての場所でこの変更を行うには、多くのモジュールと何百ものコード行を通過する必要があるため、ファイルハンドルを返すようにサブルーチンを変更したくありません(現在はステータスのみを返します)。
コードを修正して機能させるにはどうすればよいですか?