0

以下に示すスクリプトは、「E」が出現するたびに入力文字列を切り取り、配列に格納します。最終出力には、「E」のすべての位置のすべての断片化された文字列が表示されます。ただし、問題は、このスクリプトでは、出力の配列の最後の要素に「E」が表示されず、「D」までしか表示されないことです。私が得ている出力は-

ABCDEABCDE ABCDE ABCDE ABCD
ABCDE ABCDEABCDE ABCDE ABCD
ABCDE ABCDE ABCDEABCDE ABCD
ABCDE ABCDE ABCDE ABCDEABCD
ABCDE ABCDE ABCDE ABCDE ABCD

しかし、私が望む最終的な出力は-

ABCDEABCDE ABCDE ABCDE ABCDE
ABCDE ABCDEABCDE ABCDE ABCDE
ABCDE ABCDE ABCDEABCDE ABCDE
ABCDE ABCDE ABCDE ABCDEABCDE
ABCDE ABCDE ABCDE ABCDE ABCDE

私のスクリプトは-

my $s = 'ABCDEABCDEABCDEABCDEABCDE';
if (substr($s,-1) eq "E") {
    @array1 = @array[0 .. $#array-1];
    print "Results of 1-missed cleavage having 1E at the end\n\n";
    for my $array1 (@array1) {
        substr($s, $array1-1, 1) = "\0";
        my @a = split(/E(?!P)/, $s);
        substr($s, $array1-1, 1) = 'E';
        $_ =~ s/\0/E/g foreach (@a);
        $result = join ("E,", @a); 
        @final = split(/,/, $result);
        print "@final\n";
    }
    my @output=split(/E(?!P)/, $s);
    $out = join ("E,", @output); 
    @output1 = split(/,/, $out);
    print "@output1\n\n";
}
else {
    print "E is not at terminal position"
};
4

1 に答える 1

1

もう少し簡単にすることを検討しましたか?

my $s = 'ABCDEABCDEABCDEABCDEABCDE';

# Split on "E not followed by whitespace".
# Replace with "E<space><matched char, if any>"
$s =~ s/E([^\s]?)/E \1/g;

print $s, "\n\n";

出力:

haiku:~$ perl blah.pl 
ABCDE ABCDE ABCDE ABCDE ABCDE 

haiku:~$

Perlは非常に強力なテキスト操作ツールであり、正規表現は他の追随を許しません(IMHO)。

于 2012-09-12T08:20:58.170 に答える