我有这样的事情:
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
但是,我超级懒。我不想为每个可能为空的参数写一行代码。
有一个简单的解决方案吗?
答案 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;
所以,你有一些选择(从最不安全到最安全):
删除use warnings
,以便不发出警告。缺点是不会发出警告,这会使调试更加困难。
删除未初始化变量的警告。这可以通过以下方式完成:no warnings qw(uninitialized);
在您告诉它包含警告之后将其放置,并且您将仅关闭一个警告。
在尽可能小的范围内删除未初始化变量的警告。通过将no warnings命令置于较小的词法范围内,您可以将警告本地化仅限于您希望打印未初始化变量的位置,以帮助您在其他位置捕获错误。
最后一个选项可以使用以下代码完成。
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函数来初始化散列中传递的参数。首先,它查看默认哈希是否是哈希引用,如果是,则设置哈希引用中提供的默认值。接下来,它查看传递给函数的标量值,如果它们在原始哈希参数中不存在,则将这些值设置为空字符串。