Thread Code-Optimierung (4 answers)
Opened by jan999 at 2010-01-12 09:02

sid burn
 2010-01-12 10:36
#130414 #130414
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ich würde es nahezu identisch machen wie renees Lösung. Nur mit den kleinen unterschied das ich beim $type nicht ein Leerstring zurück geben würde sondern mit croak() abbrechen würde.

Nebenbei hat renee einen kleinen Fehler seine Regex arbeitet auf $_ er hat vergessen es auf $arg auszuführen.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Carp qw(croak);
# use namespace::clean; # <-- Das nur wenn du ein OOP Modul hast

sub splitTypeId {
    my ( $arg ) = @_;

    my ( $type, $id ) = $arg =~ m/ \A (\w) (\d+) \z /xms;

    my %map = (
        n => 'node',
        w => 'way',
        r => 'relation',
    );

    $type = $map{$type} 
      || croak "Invalid Type ($type) is ($arg) a correct string for splitTypeId() ?\n";

    return $type, $id;
}


Ansonsten anstatt einer Regex könnte man hier auch unpack verwenden um den String aufzuteilen.

Code (perl): (dl )
my ( $type, $nmr ) = unpack 'A A*', $arg;


EDIT:
Ab Perl 5.10 könnte man rein Theoretisch auch das "state" Statement nutzen für den Hash.

Code (perl): (dl )
state %map = ( ... );


"state" macht dann folgendes das es den Hash nicht immer wieder neu initialisiert, dass heißt die Variable wird nicht mit jedem aufruf neu generiert sondern besteht über die aufrufe hinweg, vergleichbar zu einem Closure (so müsste man es mit Perl < 5.10.0 machen). Rein theoretisch sollte das Performanter sein. Aber solche sinnlosen sachen Benchmarke ich eh nicht, das können andere machen. ;)

EDIT2:
Mir fällt gerade ein. Mit einer Regex würde ich ebenfalls noch testen ob die Regex überhaupt erfolgreich war, und wenn nicht ebenfalls croaken. Sonst kannst du irgendein mist übergeben oder du übergibst ausversehen eben "mist" und merkst es nicht auser durch ein haufen von "undef" warnings.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sub splitTypeId {
    my ( $arg ) = @_;

    my ( $type, $id );
    if ( $arg =~ m/ \A (\w) (\d+) \z /xms ) {
      $type = $1;
      $id   = $2;
    }
    else {
      croak "Invalid format ($arg)\n";
    }

    state %map = (
        n => 'node',
        w => 'way',
        r => 'relation',
    );

    if ( !exists $map{$type} ) {
      croak "Type ($type) is invalid\n";
    }

    return $map{$type}, $id;
}

Last edited: 2010-01-12 10:58:51 +0100 (CET)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Code-Optimierung