我目前有一个解决方案,但它可能不是最通用的代码。我知道有一种方法可以将模板与占位符一起用于变量,而不是将实际的运行时参数放入错误消息中。如果我问的问题不清楚,请道歉。我对如何使用模板没有太多了解。
use constant {
#list will contain more errors
ERROR_SW => {
errorCode => 727,
message => sub{"Not able to ping switch $switch_ip in $timeout seconds"},
fatal => 1,
web_page => 'http://www.errorsolution.com/727',
}
};
sub error_post {
my ($error) = @_;
print($error->{message}());
}
error_post(ERROR_SW);
我正在尝试设计它,以便我可以使用$ switch_ip和$ timeout的占位符,而不必将消息声明为子例程引用。 如下所示
use constant {
#list will contain more errors
ERROR_SW => {
errorCode => 727,
message => "Not able to ping switch **{{switch_ip}}** in **{{timeout}}** seconds",
fatal => 1,
web_page => 'http://www.errorsolution.com/727',
}
};
sub error_post {
my ($error) = @_;
print($error->{message});
}
error_post(ERROR_SW);
它们也出现在代码中:
%%error%%
我不确定如何创建将处理参数的模板。 再次道歉是因为含糊不清或不能很好地解释这一点。
答案 0 :(得分:2)
我无法立即看到printf
格式explained before未提供的此方法为您提供的服务,但是
我建议你使用Text::Template
模块这样做。它不如Template::Toolkit
那么广泛但完全适合您的目的
以下是使用Text::Template
的程序的样子。我希望它可以帮到你
use strict;
use warnings 'all';
use Text::Template qw/ fill_in_string /;
use constant {
ERROR_SW => {
errorCode => 727,
message => 'Not able to ping switch {$switch_ip} in {$timeout} seconds',
fatal => 1,
web_page => 'http://www.errorsolution.com/727',
}
};
my $values = {
switch_ip => '192.168.0.1',
timeout => 60,
};
sub error_post {
my ($error) = @_;
print( fill_in_string($error->{message}, hash => $values) );
}
error_post(ERROR_SW);
Not able to ping switch 192.168.0.1 in 60 seconds
答案 1 :(得分:0)
我会为你的项目中的每个错误类型创建一个包。每个错误对象都应该具有描述错误的必要属性,并且as_string()方法应该提供人类可读的消息。
这些包可以使用普通的面向对象框架(例如Moose)编写。对于旧的perl对象,它可能看起来像这样:
package My::Error;
sub new {
my ($class, %self) = @_;
bless \%self, $class;
}
package My::Error::SW;
use parent 'My::Error';
sub as_string {
my $self = shift;
return sprintf "Not able to ping switch %s in %s seconds", $self->{switch_ip}, $self->{timeout};
}
CPAN上存在多个框架。一个例子是使用Moose的Throwable模块。