试图制作一种方法。将消息方法放在perl

时间:2016-05-11 16:24:40

标签: perl subroutine

下面是两个与输出和错误消息一起使用的方法。我想找到一种方法来获得相同的功能,但将其减少为一种方法。

# 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;
  }

1 个答案:

答案 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); }循环之外执行此操作,因为您只需要对模板进行一次评估。