2017-05-12 19 views
2

的grep为什么不能在列表中的perl

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

打印数组包含 '的' 'RUNNER' 工作在Perl,

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

打印什么。

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

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

+3

我看不出它如何 “_prints nothing_”。你的'@ lista'有一个是arrayref的元素,正如ikegami的回答中所解释的那样。这恰恰不等于“KITE”,所以'grep'中的条件为真,并且该元素通过。所以'@ listb'包含一个元素,一个分配给'@ lista'的引用。这当然不是你想要的,但是应该打印'print Dump(\ @ listb)'。 – zdim

回答

11

[]不返回数组;它返回一个数组的引用。一个这样的,@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); 
0

grep作品,但[]返回数组引用。要使用数组,请改为使用()
这里有两个候补程序:

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

OR

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