【问题标题】:Useless use of anonymous hash ({}) in void context在无效上下文中无用地使用匿名哈希 ({})
【发布时间】:2016-09-17 07:49:00
【问题描述】:

代码收到与中类似的警告

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

【问题讨论】:

  • 将 foreach 的第一行更改为:$args{$_} //= $defaults{$_};

标签: perl


【解决方案1】:
{$args{$_}= $defaults{$_}}

error 警告发生的地方。看起来您正在尝试使用 {...} 为赋值优先于 || 比较,但 { ... } 用于定义哈希引用(或有时是代码块,但这不是它们在此上下文中的解释方式) .

由于这是 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);

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2013-11-04
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多