我正在尝试为perl中的错误消息的占位符创建模板。有什么建议?

时间:2016-03-11 13:06:17

标签: perl templates hash error-handling template-engine

我目前有一个解决方案,但它可能不是最通用的代码。我知道有一种方法可以将模板与占位符一起用于变量,而不是将实际的运行时参数放入错误消息中。如果我问的问题不清楚,请道歉。我对如何使用模板没有太多了解。

 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%%

我不确定如何创建将处理参数的模板。 再次道歉是因为含糊不清或不能很好地解释这一点。

2 个答案:

答案 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模块。