1

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

$prefix = "DV1";

以下是我的源 $input 字符串:

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

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

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

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

4

3 回答 3

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
于 2012-10-10T16:23:02.333 回答
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
于 2012-10-10T16:05:27.487 回答
-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
于 2012-10-10T16:03:07.427 回答