Установка атрибута дескриптора файла в классе Class :: Std в Perl - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь создать класс Perl LogManager , который будет использоваться для записи журналов в файл.Для этого я написал Class :: Std class со следующими спецификациями

package LogManager;

use strict;
use warnings;
use Class::Std;
use FileHandle;

my %fName     : ATTR( :name<fName> :default<"log">);
my %fLocation : ATTR( :name<fLocation> :default<"./">);
my %fHandle   : ATTR( :name<fHandle> :default<undef>);

sub START {
    my ($self, $ident, $args_ref) = @_;   
    my $logfile = $self->get_fLocation(). '/' . $self->get_fName();
    $self->set_fHandle(FileHandle->new("> $logfile"));
}

sub log {
    my ($self, $msg) = @_;
    print $self->get_fHandle(), $msg;
}

1;

Что я знаю о Class :: Std, так это то, что можно использовать функции get и set (например, get_fName(), set_fName ()) для чтения и записи значений атрибутов.Итак, я определил START () функцию , как указано выше.

Я использовал этот объект следующим образом

my $fh = LogManager->new();
LogManager::log($fh, "This is my log");

Однако вместо записи в файл,на терминале печатается следующее

FileHandle=GLOB(0x5dcdd0)This is my log

Я мог бы подумать о причине этого.В третьей строке функции START () - происходит нечто иное, чем то, что я намереваюсь - (может быть, это копирование адреса объекта дескриптора файла - это предположение).

Я новичок вPerl, и не могу придумать другой способ установить дескриптор файла.Теперь я мог бы подумать о создании обычного класса вместо Class :: Std и написать что-то вроде

my $fHandle = FileHandle->new("> $logfile");

Но, что я хотел знать - есть ли способЯ могу добиться того же, используя Class :: Std , с некоторыми изменениями в приведенном выше коде?

1 Ответ

3 голосов
/ 06 июня 2019

Синтаксис для print дескриптора файла другой: запятой нет.Также для сложных конструкций вам понадобятся фигурные скобки:

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