2013-10-20 72 views
0

我想將一個打開的文件句柄傳遞給一個方法,以便該方法可以寫入該文件。將文件句柄傳遞給Perl中的對象方法

但文件句柄似乎封閉在對象內部。

# open the file 
open(MYOUTFILE, ">$dir_1/stories.txt") or die "Can't open file stories.txt"; #open for write, overwrite 
print MYOUTFILE "outside"; #works 

my $story = ObjectStory->new(); 
$story->appendToFile(\*MYOUTFILE); 
close(MYOUTFILE); 

對象,這應該寫入文件:

package ObjectStory; 

# constructor 
sub ObjectStory::new { 
    my ($class) = @_; 
    %hash =(); 
    bless \%hash, $class; 
} 

# addToFile method 
sub ObjectStory::appendToFile { 
    my ($class, $MYOUTFILE) = @_; 

    # check if open 
    if (tell($MYOUTFILE) != -1) { 
    print $MYOUTFILE 
     "\n File Handle is not open!"; # File handle is always closed... 
    } 
    print $MYOUTFILE "test"; 
} 

# the 1 is necessary, because other scripts will require this Module. 
# require MyModule results in true, only if there is a 1 at the end of the module 
1; 
+0

這是一個***文件句柄*** – Borodin

回答

5

tell操作返回-1時,纔會有一個錯誤。沒有理由期望您顯示的代碼出現錯誤,並且它肯定不是檢測文件句柄是否打開的方法。

IO::Handleopened方法做你想做的,所以你可以寫

unless ($filehandle->opened) { ... } 

但請注意,您的原始代碼嘗試寫文件句柄不被打開到關閉文件句柄的消息,所以它永遠不會工作!

您將需要添加use IO::Handle到你的模塊,除非你正在運行的版本14或更高版本的Perl 5,這已更改,以便IO::File(等IO::Handle)被加載上的需求。

還要注意,不需要在包名稱前加上所有的子程序名稱。這就是package聲明的目的 - 更改默認命名空間,以便不必這樣做。

看看你的代碼的這個修改作爲一個例子

package ObjectStory; 

sub new { 
    my ($class) = @_; 
    my %hash; 
    bless \%hash, $class; 
} 

sub appendToFile { 
    my ($self, $fh) = @_; 
    die 'File Handle is not open!' unless $fh->opened; 
    print $fh "test\n"; 
} 

1; 
+0

日Thnx鮑羅廷。你說過,文件句柄沒有打開?在開始「appendToFile」子例程之前,我沒有在主例程中打開它嗎? '打開(MYOUTFILE,「> $ dir_1/stories.txt」)或死「不能打開文件stories.txt」;'這是否意味着,我必須在Object的子程序中重新打開它? – Skip

相關問題