2010-06-12 18 views
7

vui lòng xem mã sau trước tiên.Làm thế nào tôi có thể lưu trữ và truy cập một filehandle trong một lớp 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; 

Mục đích của tôi là lưu trữ một tệp xử lý trong lớp bằng cách sử dụng hàm băm. các tập tin xử lý là không xác định lúc đầu, nhưng có thể được initilized sau đó bằng cách gọi chức năng Setfd. sau đó viết có thể được gọi để thực sự viết chuỗi "hello word" vào một tập tin được chỉ định bởi các tập tin xử lý, cho rằng xử lý tập tin là kết quả của một thành công "viết" mở.

nhưng trình biên dịch perl chỉ than phiền rằng có lỗi cú pháp trong dòng "in". bất cứ ai trong bạn có thể cho tôi biết có gì sai ở đây không? cảm ơn trước.

+4

Một số lưu ý phụ, sử dụng bất kỳ những phong cách đặt tên để hiển thị tốt hơn tách từ: 'setFd' hoặc' set_fd' hoặc 'SetFd'. Giữ một kiểu viết hoa nhất quán, hoặc là 'write' và' set_fd' hoặc 'Write' và' Set_Fd' (tôi gợi ý cái cũ). Cũng trong Perl của nó một "tập tin xử lý" không phải là một "mô tả tập tin" vì vậy bạn muốn 'set_fh'. Cuối cùng, bật cảnh báo (hoặc 'sử dụng cảnh báo' hoặc đặt' -w' trong dòng '#!') Nó sẽ tiết lộ một lỗi trong hàm tạo của bạn. – Schwern

+1

Ngoài ra, 'sử dụng nghiêm ngặt', vì nó đã tiết lộ lỗi không phải cú pháp-nhưng-có thể-không-ý-gì-bạn này trong dòng mã này' $ self _-> {_ fd} = $ fd; ' –

+0

@ Schwern: cảm ơn lời khuyên của bạn. –

Trả lời

14

Bạn sẽ cần phải đặt các biểu hiện $self->{_fd} trong một khối hoặc gán nó vào một biểu thức đơn giản:

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

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

Từ perldoc -f print:

Lưu ý rằng nếu bạn đang lưu trữ FILEHANDLEs trong một mảng hoặc nếu bạn đang sử dụng bất kỳ biểu thức nào khác phức tạp hơn biến vô hướng để truy lục biến đó, bạn sẽ phải sử dụng một khối trả về giá trị tệp handhandle thay thế:

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

Cách khác:

use IO::Handle; 

# ... later ... 

$self->{_fd}->print('hello world'); 
Các vấn đề liên quan