匹配发生但更换没有发生

时间:2016-09-27 15:12:42

标签: perl

我要替换的行:

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{2}替换为NEW{0x02},将NEW{0}替换为NEW{0x00}

表示它在文件中匹配的所有匹配项

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 个答案:

答案 0 :(得分: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

基本上,替换运算符会为您处理条件。只有当正则表达式匹配时,它才会执行替换。

答案 1 :(得分: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+/) 

因为测试要求W{之间至少有一个空格,并且不允许{之后的空格。