下面是两个与输出和错误消息一起使用的方法。我想找到一种方法来获得相同的功能,但将其减少为一种方法。
# Method for creating error message
sub new {
my ( $class, $error, %args ) = @_;
# Initialize error with data
my $self = $error;
# If the error contains context parameters... Insert parameters into string template
foreach my $key (@{ $self->{context} } ) {
# And take the ones we need
$self->{args}->{$key} = $args{$key};
}
return bless $self, $class;
}
# Method which inserts variables into template hash field from the error hash structure
sub message {
my ($self) = @_;
return sprintf $self->template,
map { $self->args->{$_} } @{ $self->context };
}
这是Type.pm;我的错误哈希结构所在的位置。
UNABLE_TO_PING_SWITCH_ERROR => {
category => 'Connection Error',
template => "Could not ping switch %s in %s seconds.",
context => [ qw(switch_ip timeout) ],
tt => {template => 'disabled'},
fatal => 1,
wiki_page => 'www.error-fix-link.com/',
},
错误哈希中的每个字段都包含一个getter。
非常感谢任何帮助。如果需要更多信息,请在下面评论。感谢
这是我试图去的方式,但我收到一个错误,说我可以使用方法'模板'在一个未经证实的参考。我想要做的是使message成为new()方法创建的对象的元素/属性。如果这有意义吗?
# Method for creating error message
sub new {
my ( $class, $error, %args ) = @_;
# Initialize error with data
my $self = $error;
# If the error contains context parameters... Insert parameters into string template
if(%args) {
foreach my $key (@{ $self->{context} } ) {
# And take the ones we need
$self->{args}->{$key} = $args{$key};
# map/insert arguments into context hash and insert into string template
$self->template, map{ $self->{args}->{$key} } @{ $self->context };
}
# message var maps the parameters the message string (template)
return bless $self, $class;
}
return bless $self, $class;
}
答案 0 :(得分:2)
您收到错误
无法调用方法" foo"在未经证实的参考文献
当你尝试在某个不是对象的东西上调用方法时。例如:
my $h = {}; # hashref, not an object
$h->foo;
该行
$self->template, map{ $self->{args}->{$key} } @{ $self->context };
尝试在对象template
上调用方法$self
,但
$self
不是对象(它是哈希引用)template
不是一种方法(它是一个哈希键) $self->context
存在同样的问题,context
试图在$self
上调用不存在的方法my @template_args = map { $self->{args}->{$_} } @{ $self->{context} };
$self->{message} = sprintf( $self->{template}, @template_args );
。
要填充模板并将其指定给对象的属性,请执行以下操作:
foreach
您应该在function isNumeric(n) {
/* http://stackoverflow.com/a/1830844/603774 */
return !isNaN(parseFloat(n)) && isFinite(n);
}
function calc() {
var
d_1 = document.getElementById('d_1').value,
d_2 = document.getElementById('d_2').value,
result;
/* Validation for d_1 */
if (!isNumeric(d_1)) {
alert('d_1 is not a number');
return;
}
/* Validation for d_2 */
if (!isNumeric(d_2)) {
alert('d_2 is not a number');
return;
}
result = +d_1 + +d_2;
alert('Result: ' + result);
}
循环之外执行此操作,因为您只需要对模板进行一次评估。