Как я могу хранить и обращаться к файловому дескриптору в классе Perl? - PullRequest
7 голосов
/ 12 июня 2010

пожалуйста, сначала посмотрите на следующий код.

#! /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. затем Функция write может быть вызвана для фактической записи строки «hello word» в файл, указанный дескриптором файла, предполагается, что дескриптор файла является результатом успешного открытия «write».

но компилятор perl просто жалуется, что в строке "print" есть синтаксическая ошибка. может кто-нибудь из вас скажет мне, что здесь не так? заранее спасибо.

Ответы [ 2 ]

15 голосов
/ 12 июня 2010

Вам нужно будет поместить выражение $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";
7 голосов
/ 12 июня 2010

С другой стороны:

use IO::Handle;

# ... later ...

$self->{_fd}->print('hello world');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...