在void上下文中无用的匿名哈希({})

时间:2016-09-16 23:36:53

标签: perl

代码收到与

类似的警告

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");

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);