Olli: use strict, globale Variablen

Guten Morgen,
immer wieder lese ich die Empfehlungen, "use strict" zu verwenden und die Variablen möglichst nicht global zu definieren.
Hat dies Gründe, die in der Sicherheit des Scripts vor Attacken liegen oder einfach zur Sicherheit vor Fehlern im Programm (Mehrfachverwendung der gleichen Variablen für unterschiedliche Zwecke u.a.) ?
Gruß
Oliver

  1. Hallo Oli,

    es unterstützt tatsächlich beide Aspekte, wobei meiner Meinung nach die robustere Programmiertechnick deutlich im Vordergrund liegt. strict beschränkt die Art wie Referenzen verwendet und Variablen deklariert werden. Es kann einige Fälle von Hackversuchen abwehren, wo der Code so stümperhaft geschrieben wurde, dass Eingabeparameter ungeprüft als Referenz auf Subroutinen verwendet werden. Aber wenn man schon soweit ist, dass man strict verwendet, dann sollte man eigentlich über solche Anfängerpatzer hinausgewachsen sein. Viel wesentlicher ist der Aspekt, dass strict dich zur Verwendung von lokalen Variablen zwingt, was einen saubereren Programmierstil herbeiführt. Es gibt dann keine vergessenen, öfter mal wiederverwendeten und für fremde kaum lesbaren globalen Variablen. In der Praxis wird sich strict für dich zu 99% so bemerkbar machen, dass es dir beim Ausführen des Skriptes sagt, wo eine undeklarierte Variable gefunden wurde, was dann meistens ein Tippfehler deinerseits ist. Das spart eine Menge Zeit beim Debuggen, denn ohne strict wird gar nichts gesagt und da kannst oft mal lange suchen, bis dir ein Tippfehler in einer Variablennamen endlich auffällt.

    Gruß,
    Cruz

    Guten Morgen,
    immer wieder lese ich die Empfehlungen, "use strict" zu verwenden und die Variablen möglichst nicht global zu definieren.
    Hat dies Gründe, die in der Sicherheit des Scripts vor Attacken liegen oder einfach zur Sicherheit vor Fehlern im Programm (Mehrfachverwendung der gleichen Variablen für unterschiedliche Zwecke u.a.) ?
    Gruß
    Oliver

    1. Hallo Cruz,

      .. dass strict dich zur Verwendung von lokalen Variablen zwingt ..

      Das ist mir nicht klar.
      Ich kann doch schreiben:
      use strict;
      use vars qw ($v1 $v2 $v3 ......);

      ... und alle Variablen sind global !?

      Gruß
      Oliver

      1. Hi Oli,

        .. dass strict dich zur Verwendung von lokalen Variablen zwingt ..

        Das ist mir nicht klar.
        Ich kann doch schreiben:
        use strict;
        use vars qw ($v1 $v2 $v3 ......);
        ... und alle Variablen sind global !?

        Ja das ist richtig, diese sind global. Eigentlich sind sie "lokal im globalem Sinne." :) Wie auch immer, was mit strict nicht mehr geht ist innerhalb einer Subroutine oder eines sonstigen Blocks eine globale Variable zu deklarieren. Wenn schon global, dann auch explizit am Anfang des Skriptes, bzw. vor der ersten Benutzung um ganz genau zu sein.

        Ansonsten: man strict ist kurz und schmerzlos.

        Gruß,
        Cruz

        1. Hallo,
          ich habe nach wie vor Probleme mit dem global/local.
          In dem folgenden Script kommt nachfolgende Fehlermeldung für die Zeilen 29, 30, 36 und 37.

          Global symbol "$test_string" requires explicit package name at .........

          Warum kommt die Meldung an diesen Stellen ?
          Und warum dann nicht an den Zeilen 23,26,27,34, wo auch $test_string angesprochen wird ?

          1 use strict;
           2 use CGI qw/:standard/;
           3 use CGI::Carp qw(fatalsToBrowser);

          ....

          20 sub test
          21   {
          22    my @test_string;
          23    $test_string [0] = $_[0];
          24    if ($_[0] =~ /\s/)
          25      {
          26       $test_string [1] = $_[0];
          27       $test_string [1] =~ s/\s|\xE4/ /g;
          28       print "Content-type: text/html\n\n";
          29       print "<br>if $test_string [0]: $test_string [0]";
          30       print "<br>$test_string [1]: $test_string [1]";
          31      }
          32    else
          33      {
          34       $test_string [1] = "";
          35       print "Content-type: text/html\n\n";
          36       print "<br>else $test_string [0]: $test_string [0]";
          37       print "<br>$test_string [1]: $test_string [1]";
          38
          39      }
          40    return (@test_string);
          41   }

          1. 23    $test_string [0] = $_[0];

            Das Leerzeichen ist zuviel.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. 23    $test_string [0] = $_[0];

              Das Leerzeichen ist zuviel.

              Ganz schön verwirrend !
              Aber es klappt jetzt - danke