piet: lösche zeichen mit "tr" und schreibe in neue Variable

Morgen,

ich möchte alle Zeichen ausser [0-9] und [a-z] sowie [A-Z] löschen und das ergebnis auf eine neue Variable schreiben.
löschen Leerzeichen und Steuerzeichen)

alte Variable "@$_[0]"
neue Variable "$wert"

z.B.

  
tr/[a-z][A-Z][0-9]//cd;  

Wie lese ich von der alten Variable und schreibe das Ergebnis auf die neue Variable.

Gruß
        piet

  1. Hi, piet

    Zeichen außer => [^a-zA-Z0-9]
    Matchen von Teilstrings kann man durch einfache Klammern.

    Jetzt muss nur noch irgendwo "wert" herkommen, oder?

    Gruß, LX

    --
    RFC 1925, Satz 3: Mit ausreichendem Schub fliegen Schweine ganz wunderbar. (...)
    1. Hi, piet

      Zeichen außer => [^a-zA-Z0-9]
      Matchen von Teilstrings kann man durch einfache Klammern.

      Jetzt muss nur noch irgendwo "wert" herkommen, oder?

      Gruß, LX

      Danke für die schnelle Antwort

        
      @$_[0] = tr/[^a-zA-Z0-9]//cd;  
      
      

      heisst ich ich lese von @$_[0] und schreibe Ergebis nach @$_[0].

      Ich möchte aber den alten Zustand behalten und alles in einem Einzeiler lösen.

      also, lesen von @$_[0] und schreibe Ergebnis nach $wert

      Gruß
             piet

  2. Hi,

    ich möchte alle Zeichen ausser [0-9] und [a-z] sowie [A-Z] löschen und das ergebnis auf eine neue Variable schreiben.
    löschen Leerzeichen und Steuerzeichen)

    tr/[a-z][A-Z][0-9]//cd;

    paßt nicht wirklich dazu.
    Du erhältst hier alle Buchstaben (a-zA-Z), alle Ziffern (0-9) sowie eckige Klammern.
    Bei tr wird KEIN Regex benutzt, sondern Zeichenlisten (die auch Ranges wie a-z enthalten dürfen).

    Damit das nicht auf $_ angewendet wird, sondern auf eine andere Variable, muß man

    $variable =~ tr/[a-z][A-Z][0-9]//cd;

    Das Umkopieren geht m.W. nur vorher:

    $variable = $original;
    $variable =~ tr/[a-z][A-Z][0-9]//cd;

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hallo Andreas,

      tr/[a-z][A-Z][0-9]//cd;

      paßt nicht wirklich dazu.

      und wenn ich "=~ s" benutze, mir einfach nur als erstes "tr" eingefallen.
      Ich weiß nich wie, aber hier sollte es in einem Einzeiler gehen.

      Gruß
           piet

      1. Hi,

        tr/[a-z][A-Z][0-9]//cd;

        paßt nicht wirklich dazu.

        und wenn ich "=~ s" benutze, mir einfach nur als erstes "tr" eingefallen.
        Ich weiß nich wie, aber hier sollte es in einem Einzeiler gehen.

        Klar geht das in einem Einzeiler:

        $variable = $original; $variable =~ tr/a-zA-Z0-9//cd;

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Hallo,

          Hi,

          Klar geht das in einem Einzeiler:

          $variable = $original; $variable =~ tr/a-zA-Z0-9//cd;

          Das habe ich natürlich nicht gemeint :-).

          Ich habe was gelesen und probiere nun einmal

            
          ($variable = $original) =~ tr/a-zA-Z0-9//cd;  
          
          

          Vielen Dank nochmals
              piet

  3. alte Variable "@$_[0]"

    @$_[0] ist keine Variable, sondern der Slice @{$_}[0] und ist in diesem Fallbeispiel ein Programmierfalle. Es besteht die Möglichkeit, sich später damit Schwierigkeiten einzuhandeln, falls der Index mehrere Werte umfasst und der Slice einen Listenausdruck zurückliefert. Die Operatoren tr und s funktionieren nämlich nicht mit Listen, sondern nur Skalaren, Lvalues etc. (siehe perlop).

    Die bessere Schreibweise $_->[0] ist immer ein Skalarwert. So wird ein Schuh draus:

      
        use 5.013002;  
        $_       = ['foo!"$123', 'bar%&/$456', 'baz()=789'];  
        my $wert = $_->[0] =~ tr/a-zA-Z0-9//cdr;  
        say $wert; # foo123  
    
    
    1. Hallo,

      Die bessere Schreibweise $_->[0] ist immer ein Skalarwert. So wird ein Schuh draus:

      use 5.013002;
          $_       = ['foo!"$123', 'bar%&/$456', 'baz()=789'];
          my $wert = $_->[0] =~ tr/a-zA-Z0-9//cdr;
          say $wert; # foo123

        
      Ich habe dies $\_->[0] abgeändert.(man lernt nie aus) :-)  
      Hier sind nun neue Fragen aufgetaucht.  
        
      1\. Was bedeutet "use 5.013002"  
      2\. Option "r" bei "tr" verursacht einen Fehler.  
      3\. wenn es keine Veränderung des String gibt, wird dann $wert trotzdem beschrieben ??  
        
         vielen Dank  
            piet  
      
      
        1. Was bedeutet "use 5.013002"

        Siehe Doku: http://p3rl.org/use

        | In the peculiar use VERSION form, […] An exception is raised if VERSION is
        | greater than the version of the current Perl interpreter; Perl will not
        | attempt to parse the rest of the file.

        In der Praxis äußert sich das bspw. so:

        $ perl5.12.3 -e'use 5.014'
            Perl v5.14.0 required--this is only v5.12.3, stopped at -e line 1.
            BEGIN failed--compilation aborted at -e line 1.

        1. Option "r" bei "tr" verursacht einen Fehler.

        Tja, warum nur? Mag es vielleicht damit zu tun haben, dass du einen Teil meines Programms gelöscht hast, ohne Ahnung, was das anrichtet? Mag es vielleicht gerade der Teil sein, der eigens hinzugefügt wurde, um dich davor zu bewahren, das Programm mit einer zu alten Version von Perl laufen zu lassen?

        1. wenn es keine Veränderung des String gibt, wird dann $wert trotzdem beschrieben ??

        Klar, die Zuweisung (Gleichheitszeichen) erfolgt ja unbedingt.

        PS: Wohlgemeinter Ratschlag zu deiner Schreibweise - du plenkst, bitte achte in Zukunft darauf, davon abzusehen.

        1. Hallo,

          vielen Dank CPAN. Ich musste es erst mehrmals lesen, bevor ich überhaupt verstanden habe was du meinst. (Leitung sitzend)

          vielen Dank, viel gelernt
                  piet