Andi123: Regex, wie gehts?

Ich moechte von einer Nummer, wenn bei dieser nach einer beliebigen Anzahl von Nullen eine 3,4,5 oder 6 folgt, diese folgende Ziffer auch durch eine Null ersetzen.

Dazu wollte ich diesen Befehl nehmen:

$k=~s/(^0*)3|4|5|6/$10/;

Nur geht das nicht, da PERL ja nicht $1 und '0' einsetzt, sondern die Variable '$10' als Ersatz nimmt.
Ist diese leer,ist der ganze Anfang des Strings weg.

Funktionieren tut aber z.b.:

$k=~s/(^0*)3|4|5|6/$1 0/;

Nur habe ich jetzt in der Zahl ein Leerzeichen.
Das will ich auch nicht (okay, ich koennte das dann auch wieder rausnehmen).

Aber gibt es nicht einen Weg, wie ich das erledigen kann, ohne den Umweg, das zusaetzliche Zeichen wieder einzusetzen?

Danke Andi

  1. Hoi,

    $k=~s/(^0*)3|4|5|6/$10/;

    Nur geht das nicht, da PERL ja nicht $1 und '0' einsetzt, sondern die
    Variable '$10' als Ersatz nimmt.

    $k =~ s/^(0*)[3456]/${1}0/;

    Gruesse,
     CK

    1. $k =~ s/^(0*)[3456]/${1}0/;

      Danke.

      Kannst du mir auch sagen, wieso es funktioniert?

      Andi

      1. Hallo,

        $k =~ s/^(0*)[3456]/${1}0/;
        Danke.

        Kannst du mir auch sagen, wieso es funktioniert?

        Sorry, ich dachte, das waere klar. Nunja, statt '3|4|5|6' kannst du auch eine
        Zeichenklasse verwenden. Die Oder-Zeichen sind IMHO nur sinnvoll, wenn man eine
        Alternative mit mehr als einem Zeichen haben moechte. Das '${1}' ist ein
        "Feature" von Perl (andere werden sagen, es versaut den Programmierstil): man
        kann Variablen auch mit ${name} anreden. Das fuehrt in normalen Faellen zu
        Problemen in Verbindung mit 'use strict', aber in diesem Fall geht das, weil
        die Variable ($1) schon definiert ist.

        Gruesse,
         CK

        1. Hallo,

          Eine kleine Anmerkung noch:
          Variablen können in Perl immer als ${varname} angegeben werden (was ursprünglich aus Unix-Shellscripts stammt). Das ist eigentlich immer dann unumgänglich, wenn der Variablen direkt ein Text folgt. So wie eben "${1}0" oder zB "${Self}Html".
          Probleme mit "use strict" gibt es nicht - ${varname} ist 'Perl-handelsübliche' Syntax und nichts Spezielles.

          Good luck
             Manfred

          1. Hallo Manfred,

            Probleme mit "use strict" gibt es nicht - ${varname} ist 'Perl-handelsübliche'
            Syntax und nichts Spezielles.

            Was ich damit sagen wollte, war, dass es sehr schnell passieren kann, dass man
            Probleme bekommt, wenn man statt einem konstanten String eine Variable benutzt:

            ckruse@waylander:~$ perl -Mstrict -e 'my $var = ""; my $var1 = "var"; print ${$var1},"\n";'
            Can't use string ("var") as a SCALAR ref while "strict refs" in use at -e line 1.
            ckruse@waylander:~$

            Gruesse,
             CK

        2. Hi Christian,

          Das '${1}' ist ein "Feature" von Perl (andere werden sagen, es versaut
          den Programmierstil): man kann Variablen auch mit ${name} anreden.

          soweit ich das glaube verstanden zu haben, ist Perl doch irgendwie die
          Obermenge von sed, awk und diversen Shells - wahrscheinlich nicht nur
          semantisch, sondern in weiten Teilen auch syntaktisch.

          Und ${name} ist z. B. ein Element der Korn-Shell-Syntax.

          Viele Grüße
                Michael