该代码得到了类似的警告
为什么这段代码会在void context"警告中抛出"无用的匿名散列({}).
在我使用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");
Run Code Online (Sandbox Code Playgroud)
{$args{$_}= $defaults{$_}}
Run Code Online (Sandbox Code Playgroud)
是发生错误警告的地方.看起来您试图使用{...}赋值优先于||比较,但是{ ... }用于定义散列引用(或者有时是代码块,但这不是它们在此上下文中的解释方式).
由于这是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{$_};
Run Code Online (Sandbox Code Playgroud)
my %defaults=(my $config=>'kconfig', my $mem=>'kmem', my $baz=>7);
Run Code Online (Sandbox Code Playgroud)
也看起来非常错误.my用于在当前范围内声明一个新变量,该变量的初始值将是undef.这使得这一行相当于
my %defaults = (undef, 'kconfig', undef, 'kmem', undef, 7);
Run Code Online (Sandbox Code Playgroud)
从这个上下文中,我认为%defaults应该存储三个必需参数的默认参数,并且更好地写为
my %defaults = (config => 'kconfig', mem => 'kmem', baz => 7);
Run Code Online (Sandbox Code Playgroud)