これは、ファイル ハンドルの変数を作成することで簡単に解決できます。
sub _init_tmp_db {
my $self = shift;
my $fh;
open $fh, ">", "data.txt"
$self->{temp_db_fh} = $fh;
# Sometime later...
$fh = $self-{temp_db_hf};
print $fh "Bob\n";
}
これは、print
構文が解析される方法と、構文が初期段階でずさんであるための問題です。このprint
ステートメントには、実際には 2 つの異なる形式があります。フォーマット #2 は、最初の項目がファイル ハンドルであり、残りがファイル ハンドルに出力したいものであることを示しています。print
最初のパラメーターがファイル ハンドルであることを簡単に判断できない場合、失敗します。
他の言語を見ると、パラメータを使用してファイル ハンドルを渡したり、印刷するものを渡したりします。または、オブジェクト指向言語では>>
、ファイル ハンドル パラメーターをオーバーロードします。それらは次のようになります。
print "This is my statement", file=file_handle;
また
print "This is my statement" >> file_handle;
構文を変更して、変数の使用を回避できる場合があります。ただし、プログラムの効率や可読性が向上するわけではなく、単にプログラムの保守が難しくなるだけです。したがって、ファイルハンドルに変数を使用するだけです。
あなたはあなたのタイトルでクラスを言いました。これを行うための本格的なオブジェクト指向パッケージを作成することに興味があると思います。簡単な例を次に示します。write
サブルーチン メソッドで、ファイル ハンドルを変数に取得し、その変数をprint
ステートメントで使用していることに注意してください。
#! /usr/bin/env perl
#
use strict;
use warnings;
#######################################################
# MAIN PROGRAM
#
my $file = File->new;
$file->open("OUTPUT") or
die "Can't open 'OUTPUT' for writing\n";
$file->write("This is a test");
#
#######################################################
package File;
use Carp;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub open {
my $self = shift;
my $file = shift;
my $fh;
if (defined $file) {
$self->{FILE} = $file;
open ($fh, ">", $file) and $self->_fh($fh);
}
return $self->_fh;
}
sub _fh {
my $self = shift;
my $fh = shift;
if (defined $fh) {
$self->{FH} = $fh;
}
return $self->{FH};
}
sub write {
my $self = shift;
my $note = shift;
my $fh = $self->_fh;
print $fh $note . "\n";
return
}