Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays perl:使用grep进行过滤,包括针对过滤值的警告_Arrays_Perl_Filter_Grep - Fatal编程技术网

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文件的顶部。