Это легко решить, создав переменную для дескриптора файла:
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
на самом деле имеет два отдельных формата: Формат № 1 - это то, что вы просто передаете его на печать. Формат # 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
}