我正在尝试修改 returns 错误字符串的方法,以便它可以接受 Perl 中的散列

I am trying to modify a method that returns an error string so that it can accept a hash in Perl

这是当前的方法:

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

此方法 return 基本上是一个错误字符串,但我想对其进行修改,以便它也能够采用我的新错误结构和 return 来自错误哈希的字符串。我不知道如何使用祝福。 %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;
}
}

我对 bless 的理解是它使哈希引用成为对象。 错误保存在常量列表中。 这是如何执行的示例:

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

}

更新: 我一直在尝试对您的解决方案@simbabque 进行单元测试,但我一直收到一个空字符串作为 return 值,而不是错误消息字符串。 也许这是我的测试,它设置不正确?下面是我创建的测试示例:

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');

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

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;