簡體   English   中英

在perl中用grep替換foreach

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM