2017-06-19 23 views
0

我要筛选使用grep阵列警告,但欲包含所有滤波值的警告,而不是默默地过滤出来。我试过这个:perl的:使用grep过滤,包括用于滤波值

my @l = (1,2,3,4,5); 
@l = grep { 
    if ($_%2 == 0) { 
    warn "$_ is an even number!!!"; 
    return 0; 
    } 
    return 1; 
} @l; 

但是这不起作用。我没有收到警告,并且列表没有被过滤。我怎样才能做到这一点?

+1

'使用警告;','使用严格的;'所有你的Perl文件的顶部。 – stevieb

回答

2

该代码与

Can't return outside a subroutine at a.pl line 10. 

死亡回调不是一个子程序。您不能使用return

my @l = (1,2,3,4,5); 
@l = grep { 
    if ($_ % 2) { 
    1 
    } else { 
    warn "even number!!!"; 
    0 
    } 
} @l; 

印刷even number!!!一次以上是没有多大用处的。

my @nums = 1..5; 
my @odds = grep { $_ % 2 } @nums; 
warn("One or more even numbers!\n") if @odds != @nums; 
+0

我实际上并没有过滤掉偶数。这只是我用过的例子。我确实需要每个过滤值的警告。 – ewok

+0

你正在过滤什么并不重要。重复输出相同的信息没有用。 – ikegami

+0

我编辑了OP。我不只是警告“偶数”。我通知用户该号码是什么。 – ewok

2

得到警告(你需要use warnings; use strict;虽然):

Can't return outside a subroutine 

这是因为grep需要一个表达或块 - 这不是严格意义上的分。

这将工作:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @numbers = (1, 2, 3, 4, 5); 
my @odd_numbers = grep { 
    if ($_ % 2 == 0) { 
     warn "even number $_"; 
     0; 
    } 
    else { 
     1; 
    } 

} @numbers; 

print @odd_numbers; 

另外:不要使用单个字母的变量名。这是不好的风格。

+1

'不能返回外部子程序'被抛出,也没有警告。 – ikegami

0

KISS

不要试图是聪明,grep的确实是从现有列表中创建一个新的列表,使用正匹配正确的事情。是的,你可以在里面做各种奇特的事情。

,但什么是错用普通foreach? 在这里仅列出环路,做任何智能选择,推动积极到另一个列表。你有一个完整的代码块可用来处理你不需要做出超级有趣的警告,不同类型的关闭原因的...

foreach my $item (@numbers) { 
    if ($item %2) { 
     warn "fiz"; 
     next 
    } 
    unless ($item % 3) { 
     warn "buzz"; 
     next 
    } 
    push @good, $item 
} 

,每个人都在几天后可以告诉这里

发生