[英]Replace foreach with grep in 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) {
...
}
我的錯在哪里
好像有一個錯字,因為$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
,則將$PRINT_IP
設置為''
,這是一個空字符串。
該庫效率更高,首先,因為一旦發生匹配,它將停止處理。 您也可以通過在if
條件中添加last
來做到這一點,但是List::Util
例程通常更有效。
更重要的是:請始終use warnings;
並use strict;
一開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.