String in Zweiergruppen zerteilen
K@rl
- perl
Hallo zusammen,
irgendwie stehe ich auf dem Schlauch. Mal angenommen, ich habe den String
$x = '54E47374323334';
und ich will entweder eines von beiden (je nachdem was leichter / schneller geht) als Ergebnis:
$erg eq '54 E4 73 74 32 33 34'; # also ein String mit jeweils Zweiergruppen des Ausgangsstring mit Blank oder sonstwas dazwischen
oder:
@erg eq qw(54 E4 73 74 32 33 34); # also ein Array, wo jedes Element jeweils eine Zweiergruppe ...
... und ich komm' nicht drauf ...
Kennt jemand eine schöne Lösung?
Herzliche Grüße
K@rl
vasuch ma: $bla=~s/([^\ ].?)/$1\ /gi;
keine garantie ;-)
Halihallo K@rl
@erg eq qw(54 E4 73 74 32 33 34); # also ein Array, wo jedes Element jeweils eine Zweiergruppe ...
@erg = grep { !/^$/ } split(/(..)/, $string);
$string ist eben _der_ String, der gesplittet werden soll.
Viele Grüsse
Philipp
Halihallo Philipp
@erg = grep { !/^$/ } split(/(..)/, $string);
*das* ist wirklich originell .. Danke!
.. jedes zweite Elem. ist leer .. und das dann rausgrepen ..
Der ersten Anregung folgend habe ich es so gemacht:
my $hex = unpack('H*', $str);
$hex =~ s/(..)/$split$1/gc;
(wobei $split den "Abstandhalter" enthält)
Wenn ich mal Lust und Muße habe, werd' ich mir mal ansehen, welches von beiden performanter ist.
Herzliche Grüße
K@rl
Halihallo K@rl
@erg = grep { !/^$/ } split(/(..)/, $string);
*das* ist wirklich originell .. Danke!
.. jedes zweite Elem. ist leer .. und das dann rausgrepen ..
Danke ;)
Der ersten Anregung folgend habe ich es so gemacht:
my $hex = unpack('H*', $str);
$hex =~ s/(..)/$split$1/gc;
(wobei $split den "Abstandhalter" enthält)
Das macht jedoch nicht wirklich dasselbe. Es gibt dir für jedes
Zeichen des Strings die hexadezimale Repräsentation (ASCII-Code)
aus. Willst du das?
Oder war $x, das du am Anfang nanntest genau das $hex von hier?
Hm. Das Backtracking ($1) ist langsam, aber der nachträgliche Aufruf
von grep eben auch... Ja, kannst du mal testen. Ich tendiere zu
deiner Lösung.
Viele Grüsse
Philipp
Hallo K@rl,
@erg eq qw(54 E4 73 74 32 33 34); # also ein Array, wo jedes Element jeweils eine
Zweiergruppe ...
Die schnellste Lösung dafür ist:
my @nums = $str =~ /(..)/g;
Grüße,
CK
Halihallo Christian
Die schnellste Lösung dafür ist:
my @nums = $str =~ /(..)/g;
Ist es einfach und trotzdem/sogar die beste Lösung, ist es diejenige
von Christian. :-)
Viele Grüsse
Philipp
Die schnellste Lösung dafür ist:
my @nums = $str =~ /(..)/g;
Ist es einfach und trotzdem/sogar die beste Lösung, ist es diejenige
von Christian. :-)
dem schließe ich mich an :-)
Die schnellste Lösung dafür ist: my @nums = $str =~ /(..)/g;
hallo,
stimmt, sogar mit abstand
#!/usr/bin/perl no strict; no warnings; use Benchmark qw(cmpthese); my $string='EE6Hg36dgebe7253jkabad7823'; cmpthese( -1, { a => sub{my @erg = grep { !/^$/ } split(/(..)/, $string)}, b => sub{my @nums = $string =~ /(..)/g}, c => sub{$string=~s/([^\ ].?)/$1\ /gi;}} );
DATA_ Rate c a b c 350/s -- -95% -98% a 7456/s 2028% -- -64% b 20676/s 5802% 177% --
gruss