String auf numerische Zeichen prüfen in Perl ?

  • Hallo


    da ich ein Perl Programm ändern soll ohne wirklich selbiges zu sprechen:


    kann mir jemand einen Tipp geben wie
    ich einen String ($_) prüfen kann, ob er mit n numerischen Zeichen beginnt ?


    der Programmierer hat einfach 14 digits am anfang vom rest abgetrennt...
    was später probleme gibt wenn die Zeile nicht mit 14 davon beginnt...



    next if (length($_) < 16); # 14 digits + rest


    s/(\d{14})(.*)/$1=$2;/g; # put a "=" after 14 digits + ";" on the end


    %values = ();
    %values = split(/[=;]/, $_);# put pairs into a hashtable


    danke, lg

  • danke !


    kann ich auch das da machen ?



    Edited 3 times, last by NickK: Format (Code) changed ().

  • Ja, es sollte zumdest so kompilieren.


    Der Code kommt mir trotzdem etwas umständlich und buggy vor. Einerseits deuten die Regexp, das split und der Hash darauf hin, dass Strings mit beliebig vielen Zahlen/Zeichen Paaren eigelesen werden sollen , andereseits funktioniert es dank den "next if" Vergleich sowieso nur ein Paar (ein String < 16 kann kein 2 Strings > 14 beinhalten). Ohne die genauen Anforderungen und den Code rundherum nicht zu kennen, kann ich auch keine eindeutige Aussage machen. Aber davon ausgehend, dass der Code bis auf das Problem mit den 14 Zeichen bis jetzt korrekt funktioniert hat, und das $_ nicht noch wo anders verwendet wird, würde ich es so schreiben:


    Code
    1. %values = ();
    2. if ($_ =~ /(\d{14})(.*)/) {
    3. $values{$1} = $2;
    4. }
    5. else {
    6. # optional, error handling wenn es nicht 14
    7. # Zahlen sind z.B:
    8. next;
    9. }


    Da werden nicht unnötige Strings erzeugt und wieder zerlegt, und man kann auf den ersten Blick erkennen was erreicht werden soll.

  • danke ! das ist ja gleich viel logischer !



    hab ja nicht mal gewusst, ob nach durchführung von


    s/(\d+)(.*)/$1=$2;/g; # put a "=" after 14 digits + ";" on the end


    oder


    s/(\d{14})(.*)/$1=$2;/g; # put a "=" after 14 digits + ";" on the end


    welches bei weniger als 14 Zeichen mit einer Warning trotzdem weiterläuft


    das $1 weiterhin definiert bzw weiter verwendbar ist ....