piet: perl regex

Hallo,

ich möchte alle "," (Komma) durch ";" (Semikolon) austauschen. Dazu habe ich folgendes probiert

$_ =~ tr/,/;/g;

So müsste das /g dafür sorgen das alle Komma getauscht werden. Bei mir mault er nur zwecks Syntax Fehler.

Ich sehe es einfach nicht .... mein Problem ;-)

Gruß piet

  1. Tach,

    $_ =~ tr/,/;/g;
    

    So müsste das /g dafür sorgen das alle Komma getauscht werden. Bei mir mault er nur zwecks Syntax Fehler.

    nein, das g erzeugt den Syntaxfehler und ist eh überflüssig, tr erlaubt nur c, d, s und r als Optionen und ersetzt immer alle Vorkomnisse: http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

    mfg
    Woodfighter

  2. Hallo piet,

    ich habe zwar nicht den blassesten Schimmer von Perl, aber dennoch frage ich mich, ob simples Suchen & Ersetzen des Kommas durch ein Semikolon anstatt eines RegEx nicht einfacher und performanter wäre?

    Gruß
    Julius

    1. Tach,

      ich habe zwar nicht den blassesten Schimmer von Perl, aber dennoch frage ich mich, ob simples Suchen & Ersetzen des Kommas durch ein Semikolon anstatt eines RegEx nicht einfacher und performanter wäre?

      ja das wäre es, aber erstmal würde ich das als Microoptimierung betrachten.

      Mit einer Schleife ist man vermutlich schneller:

        my $pos = index($_, ",");
        while ( $pos > -1 ) {
          substr( $_, $pos, 1, ";" );
          $pos = index( $_, ",", $pos+1 );
        }
      

      aber, das ist nicht lesbarer als

      $_ =~ s/,/;/g;
      

      OPs Variante könnte man übrigens noch verkürzen auf

      tr/,/;/;
      

      aber das sieht dann schon wieder nach Write-Only-Language aus.

      Und wenn du schon RegExp durch was anderes ersetzen willst, musst du mindestens noch http://regex.info/blog/2006-09-15/247 oder https://xkcd.com/1171/ zitieren.

      mfg
      Woodfighter

      1. Hallo woodfighter,

        und dieser ganze Terz, nur um mit Perl das zu machen, was in PHP mit str_replace erledigt wird?

        Gruß
        Julius

        1. Tach,

          und dieser ganze Terz, nur um mit Perl das zu machen, was in PHP mit str_replace erledigt wird?

          es gibt bestimmt noch ein dutzend andere Methoden, aber du wolltest ja schnell sein und mir fällt auf die Schnelle nix schnelleres ein. PHP neigt im Gegensatz zu Perl dazu sehr viele sehr spezielle Funktionen anzubieten (in Perl findet man dafür dann vermutlich 5 CPAN-Module, die die Aufgabe erledigen können), was nicht unbedingt immer ein Vorteil ist, spontan aus der Liste der Stringfunktionen: strtr wäre vermutlich in diesem Falle in PHP besser als str_replace; quotemeta, addslashes und addcshlashes (hätte hier nicht ein Parameter ausgereicht); hbrev und hbrevc (dito); md5 und md5file (Überladen ist manchmal dann doch ein hilfreiches Konzept); metaphone und soundex (sind das wirklich Core-Funktionen); lcfirst; strripos; str_getcsv; strtok vs. explode; ucwords; vfprintf vs fprintf; … Ich kann vermutlich für die meisten davon Anwendungsfälle sehen, aber würde vieles davon auf den ersten Blick nicht so machen; sehr vieles davon ist auch aus historischen Gründen gewachsen, weil PHP z.B. erstmal kein OOP kannte.

          mfg
          Woodfighter

          1. Hallo woodfighter,

            und dieser ganze Terz, nur um mit Perl das zu machen, was in PHP mit str_replace erledigt wird?

            es gibt bestimmt noch ein dutzend andere Methoden, aber du wolltest ja schnell sein und mir fällt auf die Schnelle nix schnelleres ein. PHP neigt im Gegensatz zu Perl dazu sehr viele sehr spezielle Funktionen anzubieten (in Perl findet man dafür dann vermutlich 5 CPAN-Module, die die Aufgabe erledigen können), was nicht unbedingt immer ein Vorteil ist, spontan aus der Liste der Stringfunktionen: strtr wäre vermutlich in diesem Falle in PHP besser als str_replace;

            Du meinst, dass eine Lösung mit strstr performanter als str_replace wäre? Wie könnte ich denn mit strstr ein Zeichen ersetzen und warum ist das performanter als str_replace? – weil man nur das erste und nicht alle Vorkommen des Suchstrings ersetzt?
            Ich stehe da ein wenig auf dem Schlauch...

            quotemeta, addslashes und addcshlashes (hätte hier nicht ein Parameter ausgereicht); hbrev und hbrevc (dito);

            Huch, die habe ich bisher noch nie benutzt – Für das Maskieren von Variablen in SQL-Abfragen sind ja die Datenbank-spezifischen Funktionen sowieso die bessere Wahl...

            md5 und md5file (Überladen ist manchmal dann doch ein hilfreiches Konzept);

            „Überladen“ würde hier also bedeuten, dass eine fiktive, beides vereinende Funktion md5 anhand der Art des übergebenen Parameters (Datei-Zeiger oder String), bzw. allgemein anhand des Verwendungskontexts entscheidet, was zu tun ist? Habe ich das richtig verstanden?

            Gruß
            Julius

            1. Tach,

              es gibt bestimmt noch ein dutzend andere Methoden, aber du wolltest ja schnell sein und mir fällt auf die Schnelle nix schnelleres ein. PHP neigt im Gegensatz zu Perl dazu sehr viele sehr spezielle Funktionen anzubieten (in Perl findet man dafür dann vermutlich 5 CPAN-Module, die die Aufgabe erledigen können), was nicht unbedingt immer ein Vorteil ist, spontan aus der Liste der Stringfunktionen: strtr wäre vermutlich in diesem Falle in PHP besser als str_replace;

              Du meinst, dass eine Lösung mit strstr performanter als str_replace wäre?

              strtr sagte und meinte ich, weil es zum Gegensatz von str_replace nicht auf String- sondern auf Character-Ebene hantiert, würde ich vermuten, dass es effizienter implementiert ist; PHP ist schließlich in C geschrieben und da wäre das halt einfacher. Aber für wichtiger halte ich meine Aussage, dass das Microoptimierung ist, die ohne sehr viele Wiederholungen nicht messbar sein wird.

              md5 und md5file (Überladen ist manchmal dann doch ein hilfreiches Konzept);

              „Überladen“ würde hier also bedeuten, dass eine fiktive, beides vereinende Funktion md5 anhand der Art des übergebenen Parameters (Datei-Zeiger oder String), bzw. allgemein anhand des Verwendungskontexts entscheidet, was zu tun ist? Habe ich das richtig verstanden?

              Ja, in anderen Sprachen kann man Funktionsnamen mehrfach verwenden solange deren Signaturen unterschiedlich sind, in Java könnte eine Klasse zum Beispiel die folgenden Funktionen anbieten

              public class Hash{
                public static String md5(String string){};
                public static String md5(File file){};
              }
              

              und dann wird beim Kompilieren anhand des übergebenen Objekts entschieden, welche der beiden Funktionen aufgerufen wird; das geht natürlich nur, weil es (zwischen Objekten) keine implizite Typumwandlung gibt (in Java wäre Hash.md5(17) dann aber halt ein Fehler, weil keine Funktion existiert, die ein Integer (oder int) erwartet.

              mfg
              Woodfighter

              1. Hallo woodfighter,

                das geht natürlich nur, weil es (zwischen Objekten) keine implizite Typumwandlung gibt

                Um das mal etwas weiter auszuführen:

                Das Problem bei Overloading anhand von Parameter-Typen bei einer weakly typed Sprache ist, dass man sich damit unklare Situationen schafft. Beispiel:

                class Foo {
                  public function bar(float $a) { }
                  public function bar(string $a) { }
                }
                
                $foo = new Foo();
                $foo->bar(1);
                

                Welche Methode soll der Dispatcher jetzt auswählen? Beide Typ-Umwandlungen wären möglich.

                Klar kann man sich jetzt eine Hierarchie aussuchen, aber das ist prädestiniert für Verwirrung.

                LG,
                CK