2016-09-27 1 views
0

私は交換したい行を起きていない。マッチが起こるが、交換は

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

私の予想される出力:私はNEW{0x00}

NEW{0x02}NEW{0}NEW{2}を交換したい

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

ファイル内で一致するすべてのオカレンスについて

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 

基本的には、置換演算子はあなたのための条件文を処理します。正規表現が一致する場合にのみ置換を実行します。テストはW{の間に少なくとも1つのスペースを必要とし、{の後にスペースを許可しないので

+0

私はs/NEW * \ {*([02])* \}/NEW {0x0 $ 1} /に置き換えようとしました。 しかし、それは起こっていません。私はその行全体を印刷するとき – Abhishek

+0

おっと、私の悪い、私は '*'を間違っていました。もう一度やり直せますか? – redneb

+0

私は何をしたいのかはまだ変わっていません。どちらの場所にファイルを置いても、NEW {2} my type - > NEW {0x02}私のタイプ – Abhishek

0

ご入力

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

は、テスト

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

と一致していません。

関連する問題