我的要求是检查字符串并根据特定的字符集插入或替换前缀字符串
$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
答案 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