2016-09-27 82 views
0

,我想更換行:比賽發生,但更換沒有發生

1.my_type NEW{ 2} my type 
2.my_type TEST{ 0} my type 

我的預期輸出:

1. my_type NEW{ 0x02} my type 
2. my_type TEST{ 0x00} my type 

我想NEW{0x00}

NEW{0x02}NEW{0}更換NEW{2}在文件中匹配的所有匹配項

my_code:

 while (<DATA>) 
     { 
     if (/NEW\s+[{2}]\d+/) 
      { 
      s/NEW{ 2}/NEW{ 0x02}/ ; 
      } 
     elsif (/NEW\s+[{0}]\d+/) 
      { 
      s/NEW{ 0}/NEW{ 0x00}/ ; 
      } 
     } 

爲什麼更換沒有發生..?

+2

您將大部分問題格式化爲報價,並將實際問題格式化爲代碼。爲什麼?請學會正確使用減價。 – simbabque

+0

你忘了跳過大括號 – yonyon100

+0

@simbabque實際上是錯誤的,我格式錯誤。我會正確格式化。 – Abhishek

回答

1

沒有理由使用多個替代品,你可以使用一個替代品。試試這個

s/NEW *\{ *([02])* \}/NEW{ 0x0$1}/; 

並且你不需要條件。所以像這樣的事情應該這樣做:

#!/usr/bin/perl 
use strict; 
use warnings; 

while (<DATA>) { 
    s/NEW *\{ *([02]) *\}/NEW{ 0x0$1}/; 
    # do something with $_ here, e.g.: 
    print $_; 
} 

__DATA__ 
1.my_type NEW{ 2} my type 
2.my_type NEW{ 0} my type 

本質上,替代運算符爲您處理條件。它只會在正則表達式匹配時執行替換。

+0

我試圖替換s/NEW * \ {*([02])* \}/NEW {0x0 $ 1} /; 但它沒有發生。當我打印整行 – Abhishek

+0

糟糕,我錯了'*'。你可以再試一次嗎? – redneb

+0

仍然沒有更換我想要做的事情。無論哪個位置NEW都存在於文件中,它應該用NEW {2}我的類型 - > NEW {0x02}替換我的類型 – Abhishek

0

你輸入

1.my_type NEW{ 2} my type 
2.my_type NEW{ 0} my type 

,因爲測試需要W{之間至少有一個空格,並禁止{後的空間不匹配測試

if (/NEW\s+[{2}]\d+/) 
elsif (/NEW\s+[{0}]\d+/)