Arrays perl:使用grep进行过滤,包括针对过滤值的警告
我想使用Arrays perl:使用grep进行过滤,包括针对过滤值的警告,arrays,perl,filter,grep,Arrays,Perl,Filter,Grep,我想使用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 subroutin
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.
回调不是子例程。您不能使用返回
my @l = (1,2,3,4,5);
@l = grep {
if ($_ % 2) {
1
} else {
warn "even number!!!";
0
}
} @l;
打印<代码>偶数代码>不止一次不是那么有用
my @nums = 1..5;
my @odds = grep { $_ % 2 } @nums;
warn("One or more even numbers!\n") if @odds != @nums;
那密码会随着死亡而消失
Can't return outside a subroutine at a.pl line 10.
回调不是子例程。您不能使用返回
my @l = (1,2,3,4,5);
@l = grep {
if ($_ % 2) {
1
} else {
warn "even number!!!";
0
}
} @l;
打印<代码>偶数代码>不止一次不是那么有用
my @nums = 1..5;
my @odds = grep { $_ % 2 } @nums;
warn("One or more even numbers!\n") if @odds != @nums;
您确实会收到警告(您确实需要使用警告;但是需要使用strict;
):
这是因为grep
接受一个表达式或一个块-严格来说它不是sub
这将有助于:
#!/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;
另外:不要使用单字母变量名。这是一种糟糕的风格。您确实会收到警告(您确实需要使用警告;但是使用严格的;
):
这是因为grep
接受一个表达式或一个块-严格来说它不是sub
这将有助于:
#!/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;
另外:不要使用单字母变量名。这是糟糕的风格。亲吻
不要试图变得聪明,grep确实是从现有列表中创建新列表的正确方法,使用正匹配。是的,你可以在里面做各种新奇的事情
但是普通的foreach
有什么问题?
只需在列表上循环,做任何智能选择,并将积极因素推到另一个列表上。你有一个完整的代码块来处理那些你不需要的代码块,并为不同的原因发出超级有趣的警告
foreach my $item ( @numbers ) {
if ( $item %2 ) {
warn "fiz";
next
}
unless ( $item % 3 ) {
warn "buzz";
next
}
push @good, $item
}
几天后每个人都能知道这里发生了什么
不要试图变得聪明,grep确实是从现有列表中创建新列表的正确方法,使用正匹配。是的,你可以在里面做各种新奇的事情
但是普通的foreach
有什么问题?
只需在列表上循环,做任何智能选择,并将积极因素推到另一个列表上。你有一个完整的代码块来处理那些你不需要的代码块,并为不同的原因发出超级有趣的警告
foreach my $item ( @numbers ) {
if ( $item %2 ) {
warn "fiz";
next
}
unless ( $item % 3 ) {
warn "buzz";
next
}
push @good, $item
}
几天后每个人都可以知道这里发生了什么
不能返回到子例程之外
被抛出,也不能被警告。不能返回到子例程之外
被抛出,也不能被警告。我实际上并没有过滤掉偶数。这就是我使用的例子。我确实需要每个过滤值的警告。不管你过滤什么。重复输出同一条消息是没有用的。我编辑了这篇文章。我不仅仅是警告“偶数”。我正在通知用户数字是多少。这是另一种选择,但我确信您可以找到如何做到这一点,所以我没有费心向您展示。实际用例包括迭代文件并过滤哪些文件不符合某一组标准。打印出完整的文件列表非常有用,而不仅仅是“一个或多个文件不符合标准”,实际上我并没有过滤掉偶数。这就是我使用的例子。我确实需要每个过滤值的警告。不管你过滤什么。重复输出同一条消息是没有用的。我编辑了这篇文章。我不仅仅是警告“偶数”。我正在通知用户数字是多少。这是另一种选择,但我确信您可以找到如何做到这一点,所以我没有费心向您展示。实际用例包括迭代文件并过滤哪些文件不符合某一组标准。打印完整的文件列表非常有用,而不仅仅是“一个或多个文件失败标准”使用警告代码>,使用严格
位于所有Perl文件的顶部。使用警告代码>,使用严格代码>位于所有Perl文件的顶部。