【发布时间】:2011-09-15 19:13:09
【问题描述】:
我确定我的问题与命名空间和范围有关,但我需要一些帮助!
我正在编写一个 OO Perl 脚本,其中包含相当多的类,并且要求最大限度地减少外部模块的使用(不要问...我知道,我知道...)
所以,我想使用 UNIVERSAL 来提供每个对象都可以使用的日志记录方法。
这是我刚刚编写的一个非常简单的示例。
use strict;
use warnings;
package House;
sub new {
my ( $class, %args ) = @_;
my $self = {
colour => $args{colour},
size => $args{size},
};
bless $self, $class;
return $self;
}
package Boat;
sub new {
my ( $class, %args ) = @_;
my $self = {
doors => $args{doors},
roof => $args{roof},
};
bless $self, $class;
return $self;
}
package main;
my $obj = Boat->new( colour => "red", size => "big" );
$obj->_logger("created a big red boat");
my $obj2 = House->new( doors => 1, roof => "yes" );
$obj2->_logger("created a house with a door and roof");
package UNIVERSAL;
use POSIX qw( strftime );
use Sys::Hostname;
my $error_log
= hostname() . "-" . strftime( "%Y-%m-%d_%H.%M", localtime ) . ".log";
sub _dump {
my ( $self, $data, $filepath ) = @_;
open my $fh, ">", $filepath or die "Cannot write to $filepath: $!";
print $fh $data;
}
sub _logger {
my ( $self, $data ) = @_;
my $timestamp = strftime( "%Y-%m-%d %H:%M:%S", localtime );
$self->_dump( $timestamp . " " . $data, $error_log );
}
__END__
问题是 UNIVERSAL 命名空间中的 $error_log 变量似乎无法被其他类中的对象以与 UNIVERSAL 方法相同的方式访问。
my $error_log 的错误:
在 ./test_uni.pl 第 47 行打开时使用未初始化的值 $filepath。
在 ./test_uni.pl 第 47 行的连接 (.) 或字符串中使用未初始化的值 $filepath。
无法写入:./test_uni.pl 第 47 行没有这样的文件或目录。
实际上,现在我输入这个我想知道在 UNIVERSAL 中使用类方法的闭包是否可以工作。
当我去尝试的时候,请问有人对我有什么建议吗?
谢谢!
==================== 更新 =======================
在 UNIVERSAL 中使用类方法的闭包似乎有效:
package UNIVERSAL;
use POSIX qw( strftime );
use Sys::Hostname;
{
sub ERROR_LOG {
return hostname() . "-" . strftime( "%Y-%m-%d_%H.%M", localtime ) . ".log";
}
}
然后我在UNIVERSAL::_logger 和UNIVERSAL->ERROR_LOG 中调用它。
但是!我只希望在运行时创建一次 ERROR_LOG 文件路径。有了这个,它每次都会评估它......
这是唯一的方法吗?如何从其他地方访问 UNIVERSAL 包中的变量?
谢谢!
【问题讨论】:
标签: perl