String auf numerische Zeichen prüfen in Perl ?

NetzUnity und Informatik-forum wurden zusammengelegt. Eine entsprechende Ankündigung wird demnächst noch folgen. Für 2025 ist hier einiges geplant! Bei Fragen bitte per DM an Maximilian Rupp wenden.
  • 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 ?


    3 Mal editiert, zuletzt von NickK (22. November 2013 um 11:22) aus folgendem Grund: 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
    %values = ();
    if ($_ =~ /(\d{14})(.*)/) {
        $values{$1} = $2;
    }
    else {
        # optional, error handling wenn es nicht 14
        # Zahlen sind z.B:
        next;
    }

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

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!