K@rl: String in Zweiergruppen zerteilen

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

  1. vasuch ma: $bla=~s/([^\ ].?)/$1\ /gi;

    keine garantie ;-)

  2. 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

    1. 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

      1. 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

  3. 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

    --
    Wenn du gehst, gehe. Wenn du sitzt, sitze. Und vor allem: schwanke nicht!
    1. 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

      1. 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 :-)

        1. 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

          --
          no strict; no warnings;