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

Moo*_*ama 3 perl

该代码得到了类似的警告

为什么这段代码会在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)

mob*_*mob 8

{$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)