我是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) {
...
}
我的错在哪里?
答案 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;
开头。