我要篩選使用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;
但是這不起作用。我沒有收到警告,並且列表沒有被過濾。我怎樣才能做到這一點?
我要篩選使用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;
但是這不起作用。我沒有收到警告,並且列表沒有被過濾。我怎樣才能做到這一點?
該代碼與
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;
你做得到警告(你需要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;
另外:不要使用單個字母的變量名。這是不好的風格。
'不能返回外部子程序'被拋出,也沒有警告。 – ikegami
KISS
不要試圖是聰明,grep的確實是從現有列表中創建一個新的列表,使用正匹配正確的事情。是的,你可以在裏面做各種奇特的事情。
,但什麼是錯用普通foreach
? 在這裏僅列出環路,做任何智能選擇,推動積極到另一個列表。你有一個完整的代碼塊可用來處理你不需要做出超級有趣的警告,不同類型的關閉原因的...
foreach my $item (@numbers) {
if ($item %2) {
warn "fiz";
next
}
unless ($item % 3) {
warn "buzz";
next
}
push @good, $item
}
,每個人都在幾天後可以告訴這裏
發生
'使用警告;','使用嚴格的;'所有你的Perl文件的頂部。 – stevieb