代码收到与
类似的警告Why does this code throw a "Useless use of anonymous hash ({}) in void context" warning.
在我使用strict之前警告不会出现。 当我尝试在一个更大的子程序中使用这个代码时,使用严格它会失败,所以我想弄清楚为什么下面的代码在我使用strict时会给我这个警告。
#!/usr/bin/perl
use strict;
use warnings;
sub foo {
my %args=@_;
my %defaults=(my $config=>'kconfig', my $mem=>'kmem', my $baz=>7);
foreach (keys %defaults) {
defined ($args{$_}) || {$args{$_}= $defaults{$_}} ;
print $_ ," - ",$args {$_},"\n";
}
}
&foo (bar=>"1");
答案 0 :(得分:8)
{$args{$_}= $defaults{$_}}
是发生错误警告的地方。看起来您正在尝试使用{...}
赋予分配优先级||
比较,但{ ... }
用于定义哈希引用(或者有时是代码块,但这不是它们的方式在这种情况下解释。)
由于这是Perl,因此有几种方法可以重写它。
defined($args{$_}) || ($args{$_}=$default{$_}); # () are good for grouping
$args{$_} //= $defaults{$_}; # requires Perl v5.10 or better
defined($args{$_}) or $args[$_} = $default{$_}; # or has lower prec than ||
defined($args{$_}) || do { $args{$_}=$default{$_} }; # {} is a code block with do
$args{$_}=$default{$_} unless defined $args{$_};
my %defaults=(my $config=>'kconfig', my $mem=>'kmem', my $baz=>7);
也看起来非常错误。 my
用于在当前范围内声明新变量,变量的初始值为undef
。这使得这一行等同于
my %defaults = (undef, 'kconfig', undef, 'kmem', undef, 7);
从这个上下文中,我认为%defaults
应该存储三个必需参数的默认参数,并且更好地写为
my %defaults = (config => 'kconfig', mem => 'kmem', baz => 7);