我正在尝试修改 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;
这是当前的方法:
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;