在将哈希作为参数传递时避免在连接(。)中使用未初始化的值或在字符串错误中使用可怕的值

时间:2015-04-23 15:19:30

标签: perl

我有这样的事情:

VELOCITY=0 meteor run

这会引发恼人的do_something({ key1 => 'value1', key2 => 'value2'}); sub do_something { $args = $_[0]; print $$args{key1} . $$args{key2} . $$args{key3}; } 错误,因为我没有输入第三个密钥。

我很懒。所以我不想在哈希中添加第三个键。我没有为函数中的第三个键打印任何内容。

但我是肛门。我想摆脱这样的错误:

Use of uninitialized value in concatenation (.) or string

但是,我超级懒。我不想为每个可能为空的参数写一行代码。

有一个简单的解决方案吗?

5 个答案:

答案 0 :(得分:4)

print join '', map $args->{$_}, keys %$args;

sub do_something {
  my %defaults = (
    key3 => ''
  );

  my $args = $_[0];
  # overlay defaults, this will modify the data structure in the caller
  $args->{$_} ||= $defaults{$_}
    foreach keys %defaults;

  print $args->{key1} . $args->{key2} . $args->{key3};
}

答案 1 :(得分:3)

当你写

时,你已经要求Perl警告你
use warnings;

所以,你有一些选择(从最不安全到最安全):

  1. 删除use warnings,以便不发出警告。缺点是不会发出警告,这会使调试更加困难。

  2. 删除未初始化变量的警告。这可以通过以下方式完成:no warnings qw(uninitialized);在您告诉它包含警告之后将其放置,并且您将仅关闭一个警告。

  3. 在尽可能小的范围内删除未初始化变量的警告。通过将no warnings命令置于较小的词法范围内,您可以将警告本地化仅限于您希望打印未初始化变量的位置,以帮助您在其他位置捕获错误。

  4. 最后一个选项可以使用以下代码完成。

    do_something({ key1 => 'value1', key2 => 'value2'});
    
    sub do_something {
        no warnings qw(uninitialized);
        $args = $_[0];
        print $$args{key1} . $$args{key2} . $$args{key3};
    }
    

答案 2 :(得分:3)

如果您使用Perl 5.10或更高版本,请使用逻辑定义或运算符(GroupPageVM)来允许默认定义的值:

//

答案 3 :(得分:2)

不是传递哈希引用,而是传递哈希值,并使用规范的Perl方法作为命名参数的默认值:

var MasterCtrl = function ($scope, $location, $rootScope, $state, $http, baseURL, user) {
  user.getUser().then(function() {
    //stuff where you need access to user
    //this won't happen until 'user' is resolved
  });
};

答案 4 :(得分:0)

好的,这就是我提出的,大量借用mwp建议使用默认哈希。

my $args = arg_init($_[0], {default1 => value1, defaults2 => value2}, 'value4', 'value5', 'value6');

sub arg_init {
  my $args = shift; # $args is a hashref of arguments
  set_default_args($args, shift) if ref($_[0]);
  while (my $arg = shift) {
    $$args{$arg} = exists $$args{$arg} ? $$args{$arg} : '';
  }
return $args;
}

sub set_default_args {
  my ($args, $defaults) = @_;
  $args->{$_} ||= $$defaults{$_}
    foreach keys %$defaults;
}

调用arg_init函数来初始化散列中传递的参数。首先,它查看默认哈希是否是哈希引用,如果是,则设置哈希引用中提供的默认值。接下来,它查看传递给函数的标量值,如果它们在原始哈希参数中不存在,则将这些值设置为空字符串。