sorry, aber ich bin raus aus Perl. Würde wahrscheinlich nicht mal ein „Hello world“ hin bekommen. Ist zu lange her. Tut mir Leid, dass ich dir nicht helfen kann.
Ich denke mit Split ist es ein bisschen unglücklich, weil das ja die Grenzen nochmal extra separiert und ins Array speichert. Wie man das elegant lösen kann hab ich auch auf die Schnelle nicht rausgefunden, aber ich kann Dir eine unelegante Lösung anbieten:
#!/usr/bin/perl
my $string=„AGHPQRTXHXSLOKPJGKLUAAGHPQRTXHXSLOKPJGKLUA“;
my @array;
while ($string =~ m/([^RK]+([RK]|(.+$)))/g) {
my $grade = $1;
if($grade =~ m/^[^P]\w+/) {
push(@array, $grade);
}else{
my $grade2 = pop(@array);
$grade2.=$grade;
push(@array, $grade2);
}
}
print „\n\n@array“;
Das sucht einfach die Rs und Ks raus und überprüft im zweiten Schritt, ob ein P folgt. Je nachdem wie lang die Strings sind, kann das aber länger bei der Ausführung brauchen, das konnte ich nicht so testen
ein Patentrezept habe ich leider auch nicht, zumal ich mit Perl noch nicht produktiv gearbeitet habe. Reine String- Operationen werden wegen den Einschränkungen mit dem folgenden P wohl auch nicht zum Erfolg führen, es sei denn, man macht das Ganze „zu Fuß“.
Gute Möglichkeiten sehe ich bei regulären Ausdrücken.
In C# könnte das Ganze so ähnlich aussehen:
string[] parts = Regex.Split(value, „([KR])“);
Wenn man die Trennzeichen in Klammern setzt gehen sie nicht wie beim String- Operator Split verloren.
Das sind zwar nur Ansätze für die Problemlösung, die mit Perl auch anders aussehen werden, ich denke aber, das Reguläre Ausdrücke prinzipiell das richtige Mittel für die Aufgabe sind.