2016-09-27 83 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+/)