除非和grep不能正常工作

时间:2018-06-11 13:20:19

标签: perl

为什么perl不能使用下一个代码?

use Data::Dumper;

my $list=[{"name"=>1},{"name"=>1},{"name"=>2}];

foreach my $cat(@{$list}) {
    unless(grep { $_->{name} eq 3 } @{$list}+0) {
        print $count;
    }
}

打印不返回任何结果,但如果我声明变量计数,则条件除非魔术方式开始工作

use Data::Dumper;

my $list=[{"name"=>1},{"name"=>1},{"name"=>2}];

foreach my $cat(@{$list}) {
    my $count=grep { $_->{name} eq 3 } @{$list};
    unless($count) {
        print $count;
    }
}

以上代码打印111 请告诉我,为什么不使用条件除非没有声明变量my $ count?

1 个答案:

答案 0 :(得分:1)

为什么它不起作用?好吧,因为@{$list}+0。您正在向列表添加标量 - 您将得到一个标量作为结果(数组的大小,在此示例中为3)。然后,您正在使用标量而不是列表。

此外,您的第一个示例中的$count根本没有定义。

使用@{$list}代替@{$list}+0可以按预期工作,即:

use Data::Dumper;

my $list=[{"name"=>1},{"name"=>1},{"name"=>2}];

foreach my $cat(@{$list}) {
    unless(grep { $_->{name} eq 3 } @$list) {
        print "Hello there.\n";
    }
}