【问题标题】:Why grep doesn't work on lists in perl为什么 grep 在 perl 中的列表上不起作用
【发布时间】:2017-05-15 01:35:12
【问题描述】:

在 Perl 中,

my @lista = ['THE', 'KITE', 'RUNNER'];
my @listb = grep { $_ ne 'KITE' } @lista;
print "" . Data::Dumper->Dump(\@listb);

什么都不打印

my @lista = ('THE', 'KITE', 'RUNNER');
my @listb = grep { $_ ne 'KITE' } @lista;
print "" . Data::Dumper->Dump(\@listb);

打印一个包含“THE”“RUNNER”的数组。

为什么在 [] 中定义数组时 grep 不起作用?

如何对[]中定义的数组进行grep操作?

【问题讨论】:

  • 我看不出它是如何“什么都不打印”的。您的@lista 有一个元素是arrayref,如ikegami 的回答中所述。这不等于'KITE',因此grep 块中的条件为真,并且该元素通过。所以@listb 包含一个元素,一个分配给@lista 的引用。这当然不是你想要的,但print Dump(\@listb) 应该打印出来。

标签: arrays perl


【解决方案1】:

[] 不返回数组;它返回对数组的引用。这样,@lista 只包含一个元素。您正在将该引用的字符串化(类似于ARRAY(0x61dc18))与KITE 进行比较。看到这两个字符串完全不同,grep 返回引用并将其存储在@listb 中。

我认为您想要以下内容:

my $array_a = ['THE', 'KITE', 'RUNNER'];
my @array_b = grep { $_ ne 'KITE' } @$array_a;
print Data::Dumper->Dump(\@array_b);

【讨论】:

    【解决方案2】:

    grep 适用于数组,但 [] 返回一个数组引用。要使用数组,请改用()
    以下是您的程序的两个替代方案:

    use Data::Dumper;
    my $lista = ['THE', 'KITE', 'RUNNER'];
    my @listb = grep { $_ ne 'KITE' } @$lista;
    print Dumper \@listb;
    

    use Data::Dumper;
    my @lista = ('THE', 'KITE', 'RUNNER'); 
    my @listb = grep { $_ ne 'KITE' } @lista;
    print Dumper \@listb;
    

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多