perl insert和or将string变量替换为字符串

时间:2012-10-10 15:52:10

标签: regex perl

我的要求是检查字符串并根据特定的字符集插入或替换前缀字符串

$prefix = "DV1";

以下是我的源$输入字符串:

SS7.ABCWT2.RSND.LTE1.QR
IT4.ABCET2.VCE2.QR
Y88.ABCNT2.MIM.EDR2.QR
9C5.ABCS.MIM.EDR2.QR

第一个之前的第一个字符。可以是任何长度 但是在第一次之后。字符ABC保持不变,后跟任何一个字符 - 这四个字符将始终存在于我的输入字符串中。 在这4个字符之后,i / p字符串可能有两个字母数字字符 - 在这种情况下为T2。

需要做的是检查$ input是否有“T2”(可以是任何两个alphanum字符),如果它已经用D1替换那两个字符(来自$ prefix的任何两个字符)

如果$ input没有“T2”,则插入$ prefix

3 个答案:

答案 0 :(得分:1)

这可以通过单一替换非常简单地完成。该计划演示

模式查找序列.ABC,后跟任何非点字符。 \K保护模式的该部分不被更改。然后可能有两个可选的非点字符,后跟一个点。如果存在两个可选字符,则替换字符串为D1,如果不存在,则为$prefix的值

use strict;
use warnings;

my $prefix = 'DV1';

while (<DATA>) {
  s/\.ABC[^.]\K([^.]{2})?(?=\.)/$1 ? 'D1' : $prefix/e;
  print;
}

__DATA__
SS7.ABCWT2.RSND.LTE1.QR
IT4.ABCET2.VCE2.QR
Y88.ABCNT2.MIM.EDR2.QR
9C5.ABCS.MIM.EDR2.QR

<强>输出

SS7.ABCWD1.RSND.LTE1.QR
IT4.ABCED1.VCE2.QR
Y88.ABCND1.MIM.EDR2.QR
9C5.ABCSDV1.MIM.EDR2.QR

答案 1 :(得分:0)

以下是您可以尝试的代码..

我假设,T2可以是长度为2的任何字母数字字符串。它可以是 A4,或5B ......

#!/perl/bin
use v5.14;
use warnings;

my $str = "9C5.ABCS.MIM.EDR2.QR";
my $str1 = "SS7.ABCWT2.RSND.LTE1.QR";

my $prefix = "DV1";

my $file = 'D:\Programming\Perl\Learning Perl\chapter_1\demo.txt';


open my $fh, '<', $file or die $!;

foreach (<$fh>) {

    if (m/(^.*\.ABC\w)\w{2}\./g) {
        s/(^.*\.ABC\w)\w{2}\./$1D1\./;
    } else {
        s/(^.*\.ABC\w)\./$1$prefix\./;
    }
    say;  # Takes current line as default($_). We don't need to specify it.
}

输入文件: -

SS7.ABCWT2.RSND.LTE1.QR
IT4.ABCEX4.VCE2.QR
Y88.ABCN5W.MIM.EDR2.QR
9C5.ABCS.MIM.EDR2.QR

输出: -

SS7.ABCWD1.RSND.LTE1.QR  # Replace T2
IT4.ABCED1.VCE2.QR       # Replace X4
Y88.ABCND1.MIM.EDR2.QR   # Replace 5W    
9C5.ABCSDV1.MIM.EDR2.QR  # Does not contains T2. Add DV1

答案 2 :(得分:-1)

尝试以下代码,并告诉我它是否符合您的需求:

#!/usr/bin/perl -l

use strict;
use warnings;

my $text =<<EOF;
SS7.ABCWT2.RSND.LTE1.QR
IT4.ABCET2.VCE2.QR
Y88.ABCNT2.MIM.EDR2.QR
9C5.ABCS.MIM.EDR2.QR
EOF

my $prefix = "DV1";

for (split "\n", $text) {
    s/^(\w+\.ABC\w)T2/$1D1/ || s/^/$prefix/;
    print;
}

<强>输出

SS7.ABCWD1.RSND.LTE1.QR
IT4.ABCED1.VCE2.QR
Y88.ABCND1.MIM.EDR2.QR
DV19C5.ABCS.MIM.EDR2.QR