2012-01-30 3 views

답변

6

:, 또는 일반적으로 배열이나 해쉬의

당신이 저장하는 경우 핸들 당신이 bareword는 핸들보다 더 복잡한 표현식 또는 일반, unsubscripted 스칼라를 사용하고 때마다 변수를 검색하려면 대신 파일 핸들 값을 반환하는 블록을 사용해야합니다.

당신은 사용해야합니다 :

print { $$self{tmp_db_fh} } "Bob\n"; 

이 코드는 use strict에서 작동하지 않습니다. 대신 당신이해야 IO :: 파일 모듈

open my $fh, ">", "data.txt" or die $!; 
$$self{tmp_db_fh} = $fh; 
print { $$self{tmp_db_fh} } "Bob\n"; 
+1

'use strict refs';와 같이 작동하지 않습니다. – dgw

+0

많은 장소를 검색했지만 그 페이지를 찾지 못했습니다. 정말 고마워. –

0

파일 핸들은 스칼라 만 가능합니다.

그러나 $$self{tmp_db_fh}은 (data.txt로까지) 중 열린 파일 핸들 다음이 작동 것입니다 :

sub _init_tmp_db 
{ 
    my ($self) = @_; 

    my $filehandle = $$self{tmp_db_fh} ; 
    print $filehandle "Bob\n"; 
} 

나 있습니다 (_init_tmp_db

sub _init_tmp_db 
{ 
    my ($self) = @_; 

    open my $filehandle , ">", "data.txt" or die "Cannot open data.txt" ; 
    print $filehandle "Bob\n"; 
} 

내부 핸들 그러나 $$self{tmp_db_fh}에 문자열을 제공하는 열 'FILEHANDLE'과 같은) 작동하지 않습니다. print manpage에서

4

: 그냥 my 변수를 사용하여 고정합니다.

use IO::File; 
my $file = IO::File->new; 
$file->open("> data.txt"); 

print_something($file); 

sub print_something { 
    my ($file) = @_; 
    $file->print("hello world\n"); 
} 

아니면 예를 들어 함수에서

:

use IO::File; 
# ... 
sub _init_tmp_db 
{ 
    my ($self) = @_; 

    $self{tmp_db_fh} = IO::File->new; 
    $self{tmp_db_fh}->open(">", "data.txt"); 
    $self{tmp_db_fh}->print"Bob\n"; 
} 

(주, 당신은 여전히 ​​비 수 -> 너무 전화를 기반으로하지만, 내가 사용 위의 을 쓴 전통적인 -> 열기() 호출을 입력 .)

+0

Thx 제안에 대한,하지만 지금, 내가 현재 코드에서 열어 다른 모든 파일을 질문에 사용하는 방법. –

+0

괜찮습니다. IO :: File 모듈도 실제로 그렇게 작동합니다. IE의 경우, open ($ self {tmp_db_fh}, ">", "data.txt")을 사용하는 것이 안전합니다. IO :: File 핸들을 생성하면 잘 작동합니다. –

+0

[IO :: File] (http://perldoc.perl.org/IO/File.html)을 사용하기 위해 ** 필요 **하지 않습니다. 평소처럼 Perl [TMTOWTDI] (http://en.wikipedia.org/wiki/TMTOWTDI). –

0

이 쉽게 파일 핸들에 대한 변수를 생성함으로써 해결된다

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 
}