split "abcd" to "ab", "cd"

03/11/2008 - 18:57 von Martin Trautmann | Report spam
Hallo,

wie schaffe ich es eleganter, einen string paarweise in Zeichenketten
mit je zwei Zeichen zu zerlegen?

Derzeit blase ich diesen erst einmal auf passende Laenge auf (in dem
Fall fuelle ich mit Nullen vorne auf) und mache dann ein

@myarray = grep (!/^$/, split( /(..)/, $mystring));

Ohne das grep macht er aus "abcd" ein "ab", "", "cd".

Ich haette gerne

"a" -> "a"
"ab" -> "ab"
"abc" -> "a", "bc"
"abcd" -> "ab", "bc"

Irgendwas eleganteres mit /((?:..))/ habe ich nicht hinbekommen. Auch
zeichenweise rekursiv arbeitende substr-Loesungen erschienen nicht
besser.

Vermutlich kann man mit unpack oder pop besseres erreichen?

Schoenen Gruss,
Martin
 

Lesen sie die antworten

#1 Moritz Lenz
03/11/2008 - 20:13 | Warnen spam
Hallo,

Martin Trautmann wrote:
Ich haette gerne

"a" -> "a"
"ab" -> "ab"
"abc" -> "a", "bc"
"abcd" -> "ab", "bc"

Irgendwas eleganteres mit /((?:..))/ habe ich nicht hinbekommen. Auch
zeichenweise rekursiv arbeitende substr-Loesungen erschienen nicht
besser.



Das funktioniert:

$_ = 'abcde';

my @splits = m/\G(..?)(?=(?:..)*\z)/gs;
print join ', ', @splits;
print "";

Ist aber bei làngern Strings nicht gerade schnell.


Vermutlich kann man mit unpack oder pop besseres erreichen?



Mit unpack vielleicht.

Aber wiel du bei Strings mit ungerader Lànge das einzelne Zeichen am
Anfang haben willst, muss man da vermutlich ein bisschen tricksen.
$_ = 'abcdef';

print join ', ', unpack +(length($_) % 2 ? 'A(A2)*' : '(A2)*'), $_;
print "";

Vermutlich geht das auch schon schöner, aber ich weiss gerade nicht wie ;-)

Grüße,
Moritz

Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Ähnliche fragen