在我的 Perl 脚本中,我的子例程被调用了数百次,其中包含许多不同的参数集,因为发送的唯一值是与默认值不同的值。 (不言而喻,排列组合的数量非常多)为了让它更健壮,我想对参数做一些检查。这是我的子程序的缩小版本(实际版本有几十个参数非常具体,有时名称很长):

# Obtain any parameters that differ from the defaults and send for processing
sub importantSub
{
   my %params =
   (
      commandType       => 5,
      commandId         => 38,
      channel1Enable    => 0,
      channel2Enable    => 0,
      channel3Enable    => 0,
      channel4Enable    => 0,
      channel5Enable    => 0,
      channel6Enable    => 0,
      channel7Enable    => 0,
      channel8Enable    => 0,
      channel9Enable    => 0,
      channel10Enable   => 0,
      # This goes on for a VERY long time
      @_
   );

    # Make sure we have exactly as many keys as we expect - verify that
    # no additional parameters were added (Real version has 92)
   if( keys(%params) !=  92 )
   {
      croak("Unexpected parameter in hash!");
   }

   return &$privateProcessingFunction('Data Path Configuration', \%params);
}

如您所见,我目前进行检查以查看值的数量是否相同,就好像某些内容是作为“chan1Enable”而不是“channel1Enable”发送的,它会丢弃该数字。

但是由于多个其他工程师编写的多个其他脚本对子例程的调用如此之多,我想找到一种方法来查找哪个值不正确(例如,不要只说有一个意外参数,说“chan1Enable”无效)。此外,如果多个值不正确,我想列出所有值。

执行此操作的最有效方法是什么?

(我询问效率,因为该函数目前以 400 多种不同的方式被调用,而且随着应用程序的扩展,它可能会继续增长。)

最佳答案

有两种错误:提供无法识别的参数,或未能提供可识别的参数。在编辑参数列表并确保在整个应用程序中一致使用新参数时,您将不得不担心第二个问题。

最好和最简单的解决方案是使用另一个散列。

my @params = qw(commandType commandId channel1Enabled ...);
my %copy = %params;
my @validation_errors = ();

# are all the required parameters present?
foreach my $param (@params) {
    if (not exists $copy{$param}) {
        push @validation_errors, "Required param '$param' is missing.";
    }
    delete $copy{$param};
}

# since we have  delete'd  all the recognized parameters,
# anything left is unrecognized
foreach my $param (keys %copy) {
    push @validation_errors, "Unrecognized param '$param' = '$copy{$param}' in input.";
}

if (@validation_errors) {
    die "errors in input:\n", join("\n", @validation_errors);
}

关于perl - 检查不正确的哈希键输入的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17973437/

10-10 17:59