2010-06-12 65 views
7

請先看下面的代碼。如何在Perl類中存儲和訪問文件句柄?

#! /usr/bin/perl 
package foo; 

sub new { 

    my $pkg = shift; 
    my $self = {}; 
    my $self->{_fd} = undef; 
    bless $self, $pkg; 

    return $self; 
} 

sub Setfd { 

    my $self = shift; 
    my $fd = shift; 
    $self_->{_fd} = $fd; 
} 

sub write { 

    my $self = shift; 
    print $self->{_fd} "hello word"; 
} 

my $foo = new foo; 

我的意圖是使用散列來存儲文件句柄。文件句柄首先是未定義的,但可以通過調用Setfd函數來啓動。那麼可以調用 寫實際將字符串「hello word」寫入文件句柄指示的文件,假定文件句柄是成功「寫入」打開的結果。

但是,perl編譯器只是抱怨在「打印」行中有語法錯誤。你們誰能告訴我這裏有什麼問題嗎?提前致謝。

+4

一些旁註,使用任何這些命名樣式,以便更好地顯示文字的分離:'setFd'或'set_fd'或'SetFd'。保持一致的大寫形式,無論是'write'和'set_fd'還是'Write'和'Set_Fd'(我都建議前者)。另外在Perl中,它的「文件句柄」不是「文件描述符」,所以你需要'set_fh'。最後,打開警告('使用警告'或在'#!'行中放一個'-w')它會在你的構造函數中顯示錯誤。 – Schwern 2010-06-12 05:57:05

+1

此外,'use strict',因爲它會在這行代碼中顯示這個非語法但可能不是你的意思的錯誤$ self _-> {_ fd} = $ fd;' – 2010-06-13 02:11:52

+0

@ Schwern:謝謝你的建議。 – 2010-06-13 03:18:59

回答

14

你需要把$self->{_fd}表達塊或將其分配給一個簡單的表達式:

print { $self->{_fd} } "hello word"; 

    my $fd = $self->{_fd}; 
    print $fd "hello word"; 

perldoc -f print

請注意,如果你存儲的文件句柄在數組,或者如果您使用比標量變量更復雜的任何其他表達式來檢索它,則必須使用返回文件句柄值的塊代替:

print { $files[$i] } "stuff\n"; 
print { $OK ? STDOUT : STDERR } "stuff\n"; 
6

或者:

use IO::Handle; 

# ... later ... 

$self->{_fd}->print('hello world'); 
相關問題