我试图修改一个返回错误字符串的方法,以便它可以接受Perl中的哈希

时间:2016-03-23 18:42:46

标签: perl hash constants subroutine bless

这是目前的方法:

sub new {
    my ($package, $message) = (shift, shift);
    my %params = @_;
    return bless { message => $message, %params }, $package;
}

此方法基本上返回一个错误字符串,但我想修改它,以便它也能够采用我的新错误结构并从错误哈希中返回字符串。我无法理解如何使用祝福。 %params接受运行时参数,但我现在可以忽略它们。

以下是错误结构:

 # this constant is an example of an error library (just included 1 error for example)
    use constant {

        CABLING_ERROR => {
        errorCode => 561,
        message => "Cabling incorrect to device in server A4r, contact DCT ",
        tt => { template => 'cable'},
        fatal => 1,
        link =>'http://www.error-fix.com/cabling
        },
};

我刚刚开始抛出一些代码来启动,这是一次糟糕的尝试,但这就是我开始修改new()方法的方法:

sub new {
    my ($package, $message) = (shift, shift);
    # defining new error hash
    my $hash($errorCode, $message, $tt, $fatal, $link) = (shift, shift, shift, shift);
    my %params = @_;

    if(exists $hash->{errorCode}) {
    return bless { errorCode => $errorCode, message => $message, tt => $tt, fatal => $fatal, link => $link}, %params;
}   
    else {
        return bless { message => $message, %params }, $package;
}
}

我对祝福的理解是它使哈希引用的对象。 错误保存在常量列表中。 以下是如何执行它的示例:

if(!device_model) {
    die  ARC::Builder::Error->new(CABLING_ERROR);

}

更新: 我一直在尝试对您的解决方案@simbabque进行单元测试,但我继续获取一个空字符串作为返回值而不是错误消息字符串。 也许我的测试是它没有正确设置?以下是我创建的测试示例:

my $error = CABLING_ERROR;

my $exp_out_A = ($error->{message});

my $error_in = new($error);

diag($error_in);

is($error_in, $exp_out_A, 'Correct message output');

1 个答案:

答案 0 :(得分:2)

您真正想要的是构造函数,以区分是使用消息字符串调用它还是使用包含消息字符串的已知形式的散列。基本上你想要强制消息属性。

sub new {
  my ($package, $thing) = (shift, shift);
  my %params = @_;

  if (ref $thing eq 'HASH') {
    return bless { message => $thing->{message}, %params }, $package;
  }

  return bless { message => $thing, %params }, $package;
}

那就是它。只需检查您获得的参数的ref即可。如果它是哈希引用,那么它将是'HASH'。如果它是一个简单的字符串,它将是undef

如果您想从哈希引用中自动构建更多%params,那么看起来就像这样。

return bless { message => $thing->{message}, foo => $thing->{foo}, %params }, $package;