在perl中用grep替换foreach

时间:2018-09-19 15:27:48

标签: perl

我是perl的新手,我试图替换我的foreach语句(版本1):

use warnings;
use strict;

$cmd_list = "abc network xyz";
foreach my $item (split(" ", $cmd_list)) {
if( $item eq "network") {
    $PRINT_IP = 1;
    }
}

带有grep(第2版,来自互联网上的某个示例),它应该给我一个字符串数组中“ network”值的计数(由于标量上下文):

$PRINT_IP = grep(/^$network$/, split(" ", $cmd_list));

对于版本1,if语句按预期工作,但是对于版本2,它始终求值为false:

if($PRINT_IP) {
    ...
}

我的错在哪里?

1 个答案:

答案 0 :(得分:5)

似乎有错字,因为$network是一个变量;您可能是说/^network$/

程序中有use strict;会警告您一个未定义(因此未声明)的变量。拥有use warnings;可能会提醒您正则表达式编译中使用了未初始化的变量。

在循环中,如果有任何匹配的元素,则仅将变量$PRINT_TP设置为1。然后List::Util就具有一个功能

my $PRINT_IP = any { $_ eq 'network' } split ' ', $cmd_list;

my $PRINT_IP = any { /^network\z/ } split ' ', $cmd_list;

如果您需要使用正则表达式来处理更复杂的情况。

这将在第一个匹配项上返回1,这是您的for循环产生的结果。如果您确实需要计数,请确实使用grep。如果没有匹配项$PRINT_IP设置为'',则为空字符串。

该库效率更高,首先是因为一旦发生匹配,它将停止处理。您也可以通过在last条件中添加if来做到这一点,但是List::Util例程通常更有效。

更重要的是:请始终始终以use warnings;use strict;开头。