1

私が持っている要件は、文字列をチェックし、特定の文字セットに基づいて、プレフィックス文字列を挿入または置換することです

$prefix = "DV1";

以下は私のソース$input文字列です:

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

最初の前の最初の文字。任意の長さにすることができますが、最初の。文字ABCは一定のままで、その後に任意の1文字が続きます。これらの4文字は、入力文字列に常に含まれます。これらの4文字の後に、i /p文字列に2つの英数字文字(この場合はT2)が含まれる場合があります。

実行する必要があるのは、$ inputに「T2」(任意の2文字の英数字)があるかどうかを確認し、それらの2文字をD1($ prefixの任意の2文字)に置き換えたかどうかを確認することです。

$ inputに「T2」がない場合は、$prefixを挿入します

4

3 に答える 3

1

これは、1回の置換で非常に簡単に実行できます。このプログラムは

パターンは、.ABCドット以外の文字が続くシーケンスを探します。は、パターンの\Kその部分が変更されないように保護します。次に、2つのオプションの非ドット文字があり、その後にドットが続く場合があります。置換文字列はD1、2つのオプションの文字が存在する場合、または存在し$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 に答える