我正在尝试创建一个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 实现相同的目的?
答案 0 :(得分:3)
print
到文件句柄的语法是不同的:没有逗号。另外,对于复杂的结构,您需要大括号:
print { $self->get_fHandle } $msg;