이 쉽게 파일 핸들에 대한 변수를 생성함으로써 해결된다
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
구문의 구문 분석 방식과 구문의 초기 sloppiness 때문에 문제입니다. print
문은 실제로 두 가지 형식으로되어 있습니다. 형식 # 1은 단순히 인쇄물을 전달하는 것입니다. 형식 # 2는 첫 번째 항목이 파일 핸들 일 수 있으며 나머지는 파일 핸들에 인쇄 할 항목이라고 말합니다. print
이 첫 번째 매개 변수가 파일 핸들인지 쉽게 판단 할 수없는 경우 실패합니다.
다른 언어를 보면 파일 핸들을 전달하기위한 매개 변수와 인쇄 할 항목을 사용합니다. 또는 객체 지향 언어에서 파일 핸들 매개 변수에 대해 >>
을 오버로드합니다. 그들은 다음과 같이 보일 것이다 :
print "This is my statement", file=file_handle;
또는
print "This is my statement" >> file_handle;
당신은 변수를 사용하여 멀리 얻을 수있는 구문을로 찾으면 할 수 있습니다. 그러나 프로그램을 더 효율적으로 또는 더 읽기 쉽게 만들지는 못하며 단순히 프로그램을 유지 관리하기가 더 어려워 질 수 있습니다. 그래서 파일 핸들에 변수를 사용하십시오.
당신은
클래스 귀하의 제목에 말했다. 나는 당신이 이것을하기 위해 완전히 fledge 객체 지향 패키지를 작성하는 것에 관심이 있다고 가정합니다. 여기에 간단한 예가 있습니다.
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
}
'use strict refs';와 같이 작동하지 않습니다. – dgw
많은 장소를 검색했지만 그 페이지를 찾지 못했습니다. 정말 고마워. –