2017-06-19 4 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ファイルの先頭に 'use warnings;'、 'use strict;'があります。 – 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;する必要があります)を行うgrep表現またはブロックを取るためです

Can't return outside a subroutine 

を - それは厳密にサブではありません。

これは動作します:

また
#!/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 
} 

と誰も数日後にここ

何が起こっているかを伝えることができます...あなたが必要との理由オフに異なる種類の超面白い警告をしないものを処理するコードブロック全体を用意して
関連する問題