Thomas Häber: Austausch einer Variablen in einer Liste...

Hallo Ihr Forumer,

Bin Perlanfänger und werde es aus Misserfolg wohl bleiben, wenn ihr mir keine Tipps gebt (Das war keine Drohung :-0 ):

Hab hier mal einen Beispielscript, er sollte eine DOCUMENT_URI einlesen was er auch macht und diese nun gesplittete mit einem Array vergleichen.

Wenn es übereinstimmt sollte die übereinstimmende Variable mit einer neuen in der Liste vorhanden Variablen getauscht werden. Z.B. das kleine Wörtchen action mit dem Wörtchen Action (man beachte das große A), übrigens bin ich mir bewusst das man das mit richtigen Datenbanken bzw. Dateien machen sollte, hier geht es aber ums Prinzip.

Heir der Script:

#!/usr/bin/perl -w

#$Alles = $ENV{'DOCUMENT_URI'};
$Alles = "/action/perltest.shtml";

@Getrennt = split(///, $Alles);

@Liste = (@Nr1, @Nr2);
@Nr1 = ("action","Action");
@Nr2 = ("perltest.shtml","Menu");

for (@Getrennt)
{
$jetzt = $_;

for (@Liste)
{
for (@_)
 {
 if ($_[0] eq /$jetzt/)
  {

$jetzt = $_[1];

}
 }

}
print $jetzt, "\n";

}

Naja, vielen Dank.

MfG
Thomas

  1. hi!

    Wenn es übereinstimmt sollte die übereinstimmende Variable mit
    einer neuen in der Liste vorhanden Variablen getauscht werden.

    #!/usr/bin/perl -w

    use strict;

    $Alles = "/action/perltest.shtml";
    @Getrennt = split(///, $Alles);

    @Liste = (@Nr1, @Nr2);
    @Nr1 = ("action","Action");
    @Nr2 = ("perltest.shtml","Menu");

    Du kannst @Liste doch nicht defineren, bevor du @Nr1 und @Nr2 mit
    Werten belegt hast. Wenn, dann musst du das hintendran schreiben,
    also:
      @Nr1 = ("action", "Action");
      @Nr2 = ("perltest.shtml", "Menu");
      @Liste = (@Nr1, @Nr2);

    Du solltest dir übrigens im Klaren darüber sein, dass @Liste danach
    folgendermaßen aussieht:
      ("action", "Action", "perltest.shtml", "Menu")
    und nicht so, wie du es anscheinend vermutest:
      (("action", "Action"), ("perltest.shtml", "Menu"))

    Um das zu erreichen, könntest du zum Beispiel Referenzen verwenden
    (siehe perldoc perlref):
      @Liste = (@Nr1, @Nr2)
    oder Hashes:
      %Replace = ("action" => "Action", "perltest.shtml" => "Menu")

    for (@Getrennt)
    {
    $jetzt = $_;

    Vielleicht solltest du dir etwas klarer über die Syntax von Perl
    werden. Das kannst du einfach so schreiben:
      for $jetzt (@Getrennt)
    bzw. äquivalent:
      foreach $jetzt (@Getrennt)

    for (@Liste)
    {
    for (@_)

    @_ ist eine Spezialvariable, und zwar wird darin die Parameterliste
    einer Funktion bzw. des Perl-Skripts gespeichert. Der aktuelle Wert
    der @Liste steht in $_ (bzw. ist das sogar in dem Fall eine zweite
    Instanz des aktuellen Elements).

    {
    if ($_[0] eq /$jetzt/)
      {

    Hier wirfst du Stringvergleiche und reguläre Ausdrücke durcheinander.
    Richtig wäre (zumindest syntaktisch):
      if ($_ eq $jetzt)

    $jetzt = $_[1];
      }
    }

    }
    print $jetzt, "\n";
    }

    Naja, vielen Dank.

    Vielleicht einfach mal neumachen, nachdem du dich etwas mehr in Perl
    eingearbeitet hast? ;)

    bye, Frank!

    1. Hallo nochmal,

      hi!

      Wenn es übereinstimmt sollte die übereinstimmende Variable mit
      einer neuen in der Liste vorhanden Variablen getauscht werden.

      #!/usr/bin/perl -w

      use strict;

      Wenn ich use strict; verwende bekomme ich Fehlermeldungen alias package not found, liegt das am heimischen Server (OmniHTTP)?

      Übrigens klappt doch alles auch ohne strict bzw. mit standard.

      MfG
      Thomas

      1. Hallo

        use strict;

        Wenn ich use strict; verwende bekomme ich Fehlermeldungen alias package not found, liegt das am heimischen Server (OmniHTTP)?

        Nein, am Server liegt sowas nicht, höchstens am Perl Interpreter.
        Mit use strict; musst du deine Variablen vor der Benutzung mit my deklarieren. So siehst du besser, wenn du Fehler machst.
        Für dich auch sehr sinnvoll ist sicherlich der -w Schalter (bzw. use warnings;) und use diagnostics; das dir im Fehlerfall ausführlichere Fehlermeldungen bringt.

        Übrigens klappt doch alles auch ohne strict bzw. mit standard.

        Das sollte es auch, nur mit strict ist es 'besser' (nicht besser sondern 'richtiger' ääähh besser richtig 8-) richtig besser ? nein, es ist syntaktisch schöner, wenn du Variablen vorher definierst u.ä.)

        Tschö Matti

        1. Hallo,

          Das sollte es auch, nur mit strict ist es 'besser' (nicht besser sondern 'richtiger' ääähh besser richtig 8-) richtig besser ? nein, es ist syntaktisch schöner, wenn du Variablen vorher definierst u.ä.)

          Rein vom Perl-Standpunkt her ist es weder besser noch richtiger, sondern einfach nur auch richtig;-)
          Da Perl an sich dem geneigten Programmierer so viel Freiraum wie nur geht einräumt ist es eigentlich egal, ob Du use strict verwendest oder nicht. Perl wird immer versuchen, zu 'verstehen', wie es gemeint ist.

          Es gibt IMHO nur drei Gründe es zu verwenden:
          [ ] Du bist der absolute Kontrollfreak und willst Dir selbst das Leben schwerer machen, als es notwendig ist.
          [ ] Du hast wenig Vertrauen in Deine eigene Genialität und willst daß Perl so wie diese furchtbar kleinlichen Programmiersprachen oder Vvorgesetzten ständig herumnörgelt und Dich in Deinem kreativen Schaffensdrang hindern.
          [ ] Du verwendest Perl in einem Umfeld wie mod_perl, wo das Script nicht jedesmal beendet und daher beim nächstenmal neu gestartet wird. Dann kannst Du mit use strict unangenehme Seiteneffekte verhindern. Aber auch das ließe sich weitgehend durch geeignete Maßnahmen anders lösen.

          Wenn also Punkt 3 nicht zutrifft, dann gilt für use strict dasselbe, daß schon Apple's Systemprogrammierer malüber Kommentare sagten:
          "Sowas ist für Waschlappen!";-)

          Grüße
            Klaus

          1. Hallo

            [ Gründe für use strict; ]
            [ ] Du bist der absolute Kontrollfreak und willst Dir selbst das Leben schwerer machen, als es notwendig ist.
            [ ] Du hast wenig Vertrauen in Deine eigene Genialität und willst daß Perl so wie diese furchtbar kleinlichen Programmiersprachen oder Vvorgesetzten ständig herumnörgelt und Dich in Deinem kreativen Schaffensdrang hindern.
            [ ] Du verwendest Perl in einem Umfeld wie mod_perl, wo das Script nicht jedesmal beendet und daher beim nächstenmal neu gestartet wird. Dann kannst Du mit use strict unangenehme Seiteneffekte verhindern. Aber auch das ließe sich weitgehend durch geeignete Maßnahmen anders lösen.

            [ ] Weil du wirklich fehlerfrei programmieren willst (auch als Anfänger)
            Und (für mich am wichtigsten):
            [ ] Du kannst von niemanden erwarten, das er deine Scripte debuggt, wenn du nicht wenigstens zum debuggen use strict; verwendest.

            Zu Punkt 2: Ich habe Vertrauen in meine eigene "Genialität", benutze zum debugen aber trotzdem use strict (außer vielleicht für ein paar Wegwerfscripte). Warum? Weil ich dann Fehler finde (die ich sowieso mache, die macht _jeder_ (typos wenigstens), die ich sonst nicht finden würde. Das ist mir wichtiger als die zehntelsekunde die use strict; zum laden braucht.

            Tschö Matti

            1. Hallo,

              [ ] Weil du wirklich fehlerfrei programmieren willst (auch als Anfänger)

              Da lernst Du doch nicht fehlerfrei programmieren, wenn Du immer jeder noch so kleine Tippfehler sofort aufmerksam gemacht wirst. Nur durch Fehler lernt man!

              [ ] Du kannst von niemanden erwarten, das er deine Scripte debuggt, wenn du nicht wenigstens zum debuggen use strict; verwendest.

              Aber sicher doch, erwarten kann ich das von jedem. Und überhaupt, warum sollen andere meine Kunstwerke im Quellcode bewundern dürfen?

              [...](außer vielleicht für ein paar Wegwerfscripte).

              Es besteht ja noch Hoffnung. mach weiter so, gewöhn dich dran, daß es auch ohne geht, und in einiger Zeit bist du dann soweit von der Sucht befreit, da kannst Du Dich dann schon mal Scripts mit mehreren Hundert Zeilen Code wagen, ohne es zu brauchen.

              Warum? Weil ich dann Fehler finde (die ich sowieso mache, die macht _jeder_ (typos wenigstens), die ich sonst nicht finden würde.

              Also doch nicht fehlerfrei, oder was?

              Das ist mir wichtiger als die zehntelsekunde die use strict; zum laden braucht.

              Für einen Computer ist aber eine zehntelsekunde eine mittlere ewigkeit, wenn das script dann millionenmal aufgerufen wird, dann läppert es sich ganz schön;-) Da sin ein paar Stunden mehr Entwicklungszeit ein Klacks.

              Grüße
                Klaus

              1. Hallo

                [ ] Weil du wirklich fehlerfrei programmieren willst (auch als Anfänger)

                Da lernst Du doch nicht fehlerfrei programmieren, wenn Du immer jeder noch so kleine Tippfehler sofort aufmerksam gemacht wirst. Nur durch Fehler lernt man!

                Die Fehler macht man sowieso, aber strict hilft ja auch bei logischen Fehlern usw.

                [ ] Du kannst von niemanden erwarten, das er deine Scripte debuggt, wenn du nicht wenigstens zum debuggen use strict; verwendest.

                Aber sicher doch, erwarten kann ich das von jedem. Und überhaupt, warum sollen andere meine Kunstwerke im Quellcode bewundern dürfen?

                Also, das debuggen macht use strict; schon einfacher, und ich erwarte von jedem Fragesteller, wenn er nicht gerade mit Perl angefangen hat und/oder use strict; nicht kennt, das er es verwendet. Sonst muß ich nicht antworten.

                [...](außer vielleicht für ein paar Wegwerfscripte).

                Es besteht ja noch Hoffnung. mach weiter so, gewöhn dich dran, daß es auch ohne geht, und in einiger Zeit bist du dann soweit von der Sucht befreit, da kannst Du Dich dann schon mal Scripts mit mehreren Hundert Zeilen Code wagen, ohne es zu brauchen.

                Natürlich ist es ohne strict angenehmer, aber warum auf die Fehlerhinweise verzichten?

                Warum? Weil ich dann Fehler finde (die ich sowieso mache, die macht _jeder_ (typos wenigstens), die ich sonst nicht finden würde.

                Also doch nicht fehlerfrei, oder was?

                Bin ich nicht, habe ich auch nie behauptet.

                Das ist mir wichtiger als die zehntelsekunde die use strict; zum laden braucht.

                Für einen Computer ist aber eine zehntelsekunde eine mittlere ewigkeit, wenn das script dann millionenmal aufgerufen wird, dann läppert es sich ganz schön;-) Da sin ein paar Stunden mehr Entwicklungszeit ein Klacks.

                Du kannst strict in der Produktionsversion ja rausnehmen. Dann muss man aber auch sagen, dass lexikale Variablen (mit my deklariert) 'schneller' sind als globale Package-Variablen. Und das summiert sich auch.

                Tschö Matti

                1. Hallo,

                  So, jetzt hast Du mich wirklich so weit, daß ich etwas ernsthafter antworte:-(

                  Die Fehler macht man sowieso, aber strict hilft ja auch bei logischen Fehlern usw.

                  'use strict' hilft wirklich nur, einfache Tippfehler aufzuspüren. Der eigentliche 'Nutzen' liegt eher darin, daß Variablen mit my bzw. our deklariert werden müssen, weil sich Perl sonst aufregt. Sämtliche andere Sünden, die man so begehen kann, werden dadurch nicht erkannt.
                  Es funktioniert schon nicht mal wenn ich dummerweise $x anstelle $y verwende, wenn beide irgendwann im aktuellen scope deklariert wurden. Und Logikfehler sind dadurch überhaupt nicht aufzuspüren. Da helfen eigentlich wirklich nur sehr ausgefeilte Testumgebungen.
                  Das gilt übrigens für jede Programmiersprache, egal ob sie über eine strenge Typprüfung oder keine verfügt.
                  Das Denken wird Dir in keinem Falle abgenommen.

                  Also, das debuggen macht use strict; schon einfacher, und ich erwarte von jedem Fragesteller, wenn er nicht gerade mit Perl angefangen hat und/oder use strict; nicht kennt, das er es verwendet. Sonst muß ich nicht antworten.

                  Auch hier kann ich (auch jetzt mal ernsthaft) nichtganz zustimmen.
                  Mir wird um 'use strict' einfach zu viel Wind gemacht. Es wird oft als Allheilmittel gegen Programmierfehler angesehen, was es aber de facto nicht ist.
                  Mindestens genauso wichtig erscheint mir, daß jeder sich, zumindest für sich, eine konsequente Formatierung des Programmcodes einfallen läßt (perldoc perlstyle ist da sicherlich eine gute Ausgangsbasis). Irgendjemand sehr schlauer hat mla gesagt, daß Sourcecode nie für die Maschine, sondern für den Menschen geschrieben werden soll. So sind striktes einhalten von Einrückungen und eine durchgängige Nomenklatur IMHO viel nützlicher, Fehler zu vermeiden als 'use strict'.
                  Programmieren ist nun mal eine Kunst, die weit über das Einhalten syntaktischer Regeln hinaus geht.

                  Dann muss man aber auch sagen, dass lexikale Variablen (mit my deklariert) 'schneller' sind als globale Package-Variablen. Und das summiert sich auch.

                  Das ist mir neu, hast Du vielleicht einen Link, wo das näher erklärt wird?

                  Abschließend sollte ich vielleicht noch sagen, daß ich auch 'use strict' verwende, allein schon aus übermäßiger Faulheit. Auch ich will nicht wirklich jeden typo selber finden.

                  Grüße
                    Klaus

          2. Moin!

            [ ] Du verwendest Perl in einem Umfeld wie mod_perl, wo das Script nicht jedesmal beendet und daher beim nächstenmal neu gestartet wird. Dann kannst Du mit use strict unangenehme Seiteneffekte verhindern. Aber auch das ließe sich weitgehend durch geeignete Maßnahmen anders lösen.

            In dem Fall hilft Dir use strict auch nichts. AFAIK musst Du alle Variablen mit my deklarieren, damit sie ihren Inhalt am Scriptende wieder vergessen (und um Dich darauf hinzuweisen, da hilft Dir dann use strict).

            Wenn also Punkt 3 nicht zutrifft, dann gilt für use strict dasselbe, daß schon Apple's Systemprogrammierer malüber Kommentare sagten:
            "Sowas ist für Waschlappen!";-)

            Aha. Interessante Einsicht. Ich benutze es aber, um mich auf Schreibfehler hinweisen zu lassen. Sonst wundere ich mich nur, warum mein Programm alles falsch macht, habe aber keinen Anhaltspunkt, woran das liegt. Mit use strict und -w kann ich die Zeit fuer die Fehlersuche durchaus auf 1/10 reduzieren. Dafuer nehm ich die Titulierung Waschlappen gerne in Kauf. ;-)

            So long

            1. Hallo,

              [ ] Du verwendest Perl in einem Umfeld wie mod_perl, wo das Script nicht jedesmal beendet und daher beim nächstenmal neu gestartet wird. Dann kannst Du mit use strict unangenehme Seiteneffekte verhindern. Aber auch das ließe sich weitgehend durch geeignete Maßnahmen anders lösen.

              In dem Fall hilft Dir use strict auch nichts. AFAIK musst Du alle Variablen mit my deklarieren, damit sie ihren Inhalt am Scriptende wieder vergessen (und um Dich darauf hinzuweisen, da hilft Dir dann use strict).

              Du hast recht, da brauchts das strict wirklich nicht. Gibt also doch nur zwei Gründe, es zu verwenden:-)

              Aha. Interessante Einsicht. Ich benutze es aber, um mich auf Schreibfehler hinweisen zu lassen. Sonst wundere ich mich nur, warum mein Programm alles falsch macht, habe aber keinen Anhaltspunkt, woran das liegt. Mit use strict und -w kann ich die Zeit fuer die Fehlersuche durchaus auf 1/10 reduzieren. Dafuer nehm ich die Titulierung Waschlappen gerne in Kauf. ;-)

              Also bist Du auch einer, der die Gefahr und das Abenteuer scheut. Wo sind nur die Zeiten hin, wo Programmieren noch echt spannend war. Diese neumoderne Zeuchs ist doch nichts für wahre Recken im Kampf mit der Maschine. Alles nur noch bequem aus dem Fernsehsessel reingezappt und den Rest erledigen die Helferchen. Nur weil jemand nicht mal eben so ca 100-200 Variablen- bzw. Funktionsnamen im Kopf hat, muß schon so eine ultimativbigbrothermäßige Überwachungsfunktionalität her, welche das dann für denjenigen erledigen soll.
              Wo bleibt der Mut sich den Herausforderungen des Lebens zu stellen? Und, nur das Arbeiten ohne Netz schäfrt die Sinne und den Verstand. Demnächst wirds dann noch so eine Klickibunti-schickimicki IDE geben, in der alle sich das Script dann zusammenklicksen kann [1]. Igittigitt.

              Ich finde ja schon diese
              <cite>
              syntax error at - line 1, near "=;"
              Execution of - aborted due to compilation errors.
              </cite>
              Meldungen für absoltuter Bevormundung. Warum nicht einfach
              <cite>
              Execution error.
              </cite>
              oder noch besser gar nichts. Wenn das Ding nichts macht, dann merke ich doch auch, daß was faul ist. Und dann habe ich wieder das Vergnügen, den ganzen wunderbaren Code nochmals zu lesen, um zu bewundern, welch herrliches Stück Software hier am Entstehen ist.

              Also, zeigt ein bißchen mehr Wagemut und verzichtet auch solche Dinger, vor allem, wenn s auch so schön ohne geht.

              Fröhliche Grüße
                Klaus

              [1] Ich weiß, ich weiß, das gibts doch schon alles :-(

              1. Hi Klaus!

                Ja, vielleicht hast Du recht. Das Leben kann so aufregend sein, wenn man nicht immer versucht, die Gefahr zu meiden. Aber ich denke, ich werde doch erstmal frueh mit 5 Grad Celsius Wasser duschen, so als Anfang zum dran gewoehnen. Spaeter mach ich dann auch weiter mit Survival Coding.

                So long