Perl string schneiden und in ein array speichern

Hallo Zusammen,
ich hab ein Problem. Ich habe einen String mit einer zusammenhängenden Zeichenfolge

$string=„AGHPQRTXHXSLOKPJGKLUA“

ich will diesen String nun an bestimmen Stellen schneiden:
Immer nach dem Buchstaben „K“ oder „R“ aber nur sofern auf diese Buchstaben kein „P“ folgt!

Das Ergebnis sollte dann ein Array sein das in diesem Beispiel so aussieht:
„AGHPQR“ „TXHXSLOKPJGK“ „LUA“

Wie könnte ich sowas anstellen?

Gruß Jürgen

Hallo Jürgen,

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.

Viele Grüße,

Silverius

Hallo Jürgen,

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“;

print"\n\nSo solls aussehen:\nAGHPQR TXHXSLOKPJGK LUA\n\n";

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 :smile:

Liebe grüße
Lena

Hallo,

eine Möglichkeit wäre z.B. diese:

$string =~ s/([rk])([^p])/$1\n$2/gi;
@array = split(/\n/i, $string);

Tschö,
Sascha

so sollte es klappen

#######################################################################

VBString2Array {

Aus VB-String einen Array machen

der String wird bei jedem Vorkommen von xa0 oder x20 geschnitten und im Array abgelegt
################

sub VB2A {
my ($temp) = @_;
my @out = split(/ /,$temp);
for (@out) {
if ($_) {
s/\xa0/\x20/g;
} else {
$_ = ‚‘;
}
}
return @out;
}

Hallo Jürgen,

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.

Ein anderer Ansatz ist folgender:

string input = „AGHPQRTXHXSLOKPJGKLUA“;
Regex reg = new Regex(@"[A-JL-QS-Z]*[RK]{1}");
MatchCollection coll = reg.Matches(input);

Durch das Beispiel wird das Ganze in

„AGHPQR“ „TXHXSLOK“ „PJGK“ aufgeteilt.

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.

Gruß
ziba