我要筛选使用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