如何在Perl类中存储和访问文件句柄?

时间:2010-06-12 05:28:54

标签: perl filehandle

请先查看以下代码。

#! /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;

我的目的是使用hash在类中存储文件句柄。文件句柄最初是未定义的,但之后可以通过调用Setfd函数来启动。然后 可以调用write来实际将字符串“hello word”写入文件句柄指示的文件,假设文件句柄是成功“写”打开的结果。

但是,perl编译器只是抱怨“print”行中存在语法错误。谁能告诉我这里有什么问题?提前谢谢。

2 个答案:

答案 0 :(得分:15)

您需要将$self->{_fd}表达式放在一个块中或将其指定给一个更简单的表达式:

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

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

来自perldoc -f print

  

请注意,如果您将FILEHANDLE存储在数组中,或者如果您正在使用比标量变量更复杂的任何其他表达式来检索它,则必须使用块来返回文件句柄值:

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

答案 1 :(得分:7)

可替换地:

use IO::Handle;

# ... later ...

$self->{_fd}->print('hello world');