在Perl的Class :: Std类中设置文件句柄属性

时间:2019-06-06 12:31:30

标签: perl

我正在尝试创建一个Perl类 LogManager ,该类将用于将日志写入文件。为此,我编写了一个具有以下规范的 Class :: Std类

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() function

我已如下使用该对象

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 个答案:

答案 0 :(得分:3)

print到文件句柄的语法是不同的:没有逗号。另外,对于复杂的结构,您需要大括号:

print { $self->get_fHandle } $msg;