2017-06-19 43 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 
} 

,每個人都在幾天後可以告訴這裏

發生