2015-09-04 193 views
-1

我想匹配後跟「ETN:」(即(name1/name2))的字符串,並且在匹配它之後,我想要在字符串「數據達到了」使用perl打印匹配的字符串

ETN: name1/name2 

    abchsfk/jshflka/ZN      (cellLVT) 

    asjkfsa/sfklfkshfsf/Z     (mobSVT) 

    asjhfdjkfd/sjfdskjfhdk/hsakfshf/Z  (celLVT) 

    asjhdjs/jhskjds/ZN      (abcSVT) 

    shdsjk/jhskd/ZN       (xyzSVT) 

    name1/name2/ZN     (abcLVT)  

    data reached 



    asjhfdjkfd/sjfdskjfhdk/hsakfshf/Z  (celLVT) 

    asjkfsa/sfklfkshfsf/Z     (mobSVT) 

    shdsjk/jhskd/ZN       (xyzSVT) 

    asjhdjs/jhskjds/ZN      (abcSVT) 

    shdsjk/jhskd/ZN       (xyzSVT) 

    name1/name2/ZN     (abcLVT) 

ETN: name3/name4 

    abchsfk/jshflka/ZN      (cellLVT) 

    asjkfsa/sfklfkshfsf/Z     (mobSVT) 

    asjhfdjkfd/sjfdskjfhdk/hsakfshf/Z  (celLVT) 

    asjhdjs/jhskjds/ZN      (abcSVT) 

    shdsjk/jhskd/ZN       (xyzSVT) 

    name3/name4/ZN     (fhLVT)  

    data reached 



    asjhfdjkfd/sjfdskjfhdk/hsakfshf/Z  (celLVT) 

    asjkfsa/sfklfkshfsf/Z     (mobSVT) 

    shdsjk/jhskd/ZN       (xyzSVT) 

    asjhdjs/jhskjds/ZN      (abcSVT) 

    shdsjk/jhskd/ZN       (xyzSVT) 

    name3/name4/ZN     (fhLVT) 

輸出:

name1/name2/ZN     (abcLVT) 

name3/name4/ZN     (fhLVT) 

CODE:

我試圖用ETN 3月1日的字符串,並試圖將其打印出來。

if ($line =~ m/ETN: /) 

     { 
    my @names = split//, $line; 

    $a = $names[3]; 

     if ($line =~ m /$a /) 

     { 
      print " $line \n" ; 
     }  

    } 

回答

1

您的代碼並不顯示在您檢索文件$行的循環,但它看起來像你想使用嵌套的方式,在這種情況下,你錯過了另一個這樣的循環。如果每條記錄都以「達到的數據」結束,那麼這種方法就行得通了,但這並不總是出現在您的示例數據中。然而,在這種情況下嵌套循環不是必需的,也不會增加可讀性,所以只需使用如下所示的單個循環。

首先,談幾點看法:

  • 你不需要將M //你的正則表達式作爲//就足夠了,因爲它不是一個多行匹配。

  • 你應該使用^錨不僅準確性,但速度。

  • 通過使用特殊匹配變量,您可以從正則表達式中檢索沒有分割線的名稱。如下所示$ 1。

  • 我沒有在我的代碼中使用$行,只是假設的$ _ var,這是常見的Perl風格。由於它被假定,它沒有寫在代碼中。

  • 如果您不嚼線,則不需要在打印時添加換行符。

下面是你的代碼,顯示輸入循環,修改後的工作。我在下面的兩個條件中使用了$ name,這相當於檢查它是否已定義而不是空的。

my $name; 
while (<$in>) 
{ 
    if (/^ETN:\s+(\S+)/) { $name = $1 } 
    elsif ($name and /^\s+$name/) { print } 
} 
$name or warn("No ETN records found\n"); 
+0

謝謝你的解釋。我試圖編寫代碼,仍在學習。你的解釋非常有用。我會努力的。 – SKG

-1

你可以使用這個簡單的正則表達式。試試下面的代碼:

if ($inputstring =~ m/ENT:.*?($name1/$name2)ZN/) { 
    print "$1\t$2" 
} 

$name1$name2將匹配字符串。這將打印:

name1 tab name2 
+0

謝謝。我會嘗試這種方法 – SKG

+1

你只有一個捕獲組,所以'$ 2'不會被設置。但是如果你已經有變量'$ name1'和'$ name2',那麼就不需要首先捕獲它們。 – ThisSuitIsBlackNot