Christoph Schnauß: wie sinnvoll ist "use vars qw();" ?

hallo Forum ;-)

Mal eine etwas theoretische Frage: wann ist die Verwendung von "use vars qw()" sinnvoll und wann kann oder soll man darauf verzichten?

Zur Erläuterung: ich habe mir in letzter Zeit angewöhnt, wenn ich irgendwas mit PERL für ein CGI-Script basteln will, nach der shebang grundsätzlich erstmal

use strict;
use CGI;
my $cgi = new CGI;
use CGI::Carp qw(fatalsToBrowser);
use vars qw(
);

zu schreiben. "my $cgi" ist Gewohnheitssache und könnte auch anders heißen. "vars qw()" nimmt die Variablennamen auf, die ich wahrscheinlich so im Lauf des Scripts benötigen werde. Fahrlässig grob zusammengefaßt hat es den Effekt, daß ich im restlichen Script nirgends mehr "my" vor einen Variablennamen schrieben muß  -  es sei denn, ich bin mir in irgendeiner Subroutine sicher, daß ich doch "my" oder "local" für eine Variable festlegen möchte.

"vars qw()" benutze ich also eigentlich aus Bequemlichkeit. In (seltenen) selbstkritischen Momenten halte ich aber Bequemlichkeit nicht unbedingt für die korrekte Motivation. perldoc liefert mir natürlich eine ganze Reihe Aussagen, aber ehrlich gesagt hab ich die möglicherweise nicht ganz verstanden. Wann also brauche ich "use vars qw()" wirklich und wann sollte ich darauf verzichten?

Grüße aus Berlin

Christoph S.

  1. hi Christoph,

    Mal eine etwas theoretische Frage: wann ist die Verwendung von "use vars qw()" sinnvoll und wann kann oder soll man darauf verzichten?

    Wenn du strict verwendest und eigene Libs mit

    require 'mylibrary.pl';

    eibaust wo du in dem main - Script Variablen verwenden möchtest die in der Library auch verwendet werden , wirst du um

    use vars qw($foo $bar %wetter @mist);

    nicht herum kommen.

    deine - Frage - praktisch angewandt ;-)

    Erwin

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
  2. Hi Christoph,

    Mal eine etwas theoretische Frage: wann ist die Verwendung von "use vars qw()" sinnvoll und wann kann oder soll man darauf verzichten?

    TIMTOWTDI (oder so ähnlich).

    Grundsätzlich heißt es bei "sauberem" Programmieren, möglichst mit wenig globalen, dafür mit den passenden privaten Variablen zu arbeiten, damit die Schnittstelle einer Subroutine deutlich wird. Daran sollte man sich insbesondere halten, wenn man den entsprechenden Programmteil mehrmals verwenden will - dann ist das beinahe unerläßlich.

    Ist dein Programm eher weniger allgemein, spricht wenig dagegen, einige Variablen global zu handhaben - um mehr Übersichtlichkeit zu wahren. Das trifft insbesondere zu auf kurze Programme. Eine "Schnittstelle" für eine eigene Funktion zu beschreiben, die man sicher nur einmal braucht, ist rausgeworfene Zeit.

    Zu deinem Beispiel mit $cgi - in einem solchen Fall würde ich das CGI-Objekt global verwalten, allerdings diese nur in deinem Hauptquelltext abfragen, nicht in den Subroutinen. Das ist allerdings größtenteils Geschmackssache.

    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
    1. hallo Matti,

      TIMTOWTDI (oder so ähnlich).

      ups? Gibts einen regulären Ausdruck, der mit das übersetzt? *g*

      Grundsätzlich heißt es bei "sauberem" Programmieren, möglichst mit wenig globalen, dafür mit den passenden privaten Variablen zu arbeiten, damit die Schnittstelle einer Subroutine deutlich wird. Daran sollte man sich insbesondere halten, wenn man den entsprechenden Programmteil mehrmals verwenden will - dann ist das beinahe unerläßlich.

      Einverstanden. Selbstverständlich habe ich den Ehrgeiz, ein "sauberes" Programm zu basteln.

      Ist dein Programm eher weniger allgemein, spricht wenig dagegen, einige Variablen global zu handhaben - um mehr Übersichtlichkeit zu wahren. Das trifft insbesondere zu auf kurze Programme. Eine "Schnittstelle" für eine eigene Funktion zu beschreiben, die man sicher nur einmal braucht, ist rausgeworfene Zeit.

      Auch einverstanden. Allerdings fällt es mir schwer, herauszufinden, wo ich nun "eher weniger allgemeine" Teile in meinem Script habe.

      Zu deinem Beispiel mit $cgi - in einem solchen Fall würde ich das CGI-Objekt global verwalten, allerdings diese nur in deinem Hauptquelltext abfragen, nicht in den Subroutinen.

      Ich habe ein Beipiel grade in Arbeit, siehe [pref:t=69173&m=397730]. Inzwischen habe ich die Hinweise von Cheatah und Rolf allerdings berücksichtigt, so daß das dort (in diesem Thread) diskutierte Problem "behoben" scheint  -  allerdings ist mein Ergebnis wahrscheinlich nicht "schön". Das korrigierte Script liegt auf http://www.christoph-schnauss.de/temp/suche.txt. Zur Sortierung habe ich auf die Schnelle das von Stefan in SELFHTML (http://selfhtml.teamone.de/cgiperl/funktionen/listenhashes.htm#sort) angegebene Beispiel genommen - es sollte halt _erstmal irgendwie_ funktionieren, ehe ich an weitere Feinarbeiten gehe.

      Dort habe ich "use vars qw()" eingesetzt ...

      Ich habe einfach Zweifel, ob ich tatsächlich "sauber" arbeite. Daher habe ich gefragt.

      Grüße aus Berlin

      Christoph S.

      1. Hallo Christoph,

        TIMTOWTDI (oder so ähnlich).

        ups? Gibts einen regulären Ausdruck, der mit das übersetzt? *g*

        There Is More Than One Way To Do It. Der Wahlspruch von Perl.

        Ist dein Programm eher weniger allgemein, spricht wenig dagegen,
        einige Variablen global zu handhaben - um mehr Übersichtlichkeit
        zu wahren.

        Mit globalen Variablen sollte man IMHO *sehr* vorsichtig sein. Die
        Verwendung kann sehr häufig fehleranfällig sein.

        Das trifft insbesondere zu auf kurze Programme. Eine
        "Schnittstelle" für eine eigene Funktion zu beschreiben, die man
        sicher nur einmal braucht, ist rausgeworfene Zeit.

        Auch einverstanden. Allerdings fällt es mir schwer, herauszufinden,
        wo ich nun "eher weniger allgemeine" Teile in meinem Script habe.

        Halte dich an das Motto, dass jede Zeile Code in einem beliebigen
        Zusammenhang wieder auftauchen kann.

        Grüße,
         CK

        --
        Sein oder nicht sein, das ist hier die Frage!
        1. grüßchens,

          Mit globalen Variablen sollte man IMHO *sehr* vorsichtig sein. Die
          Verwendung kann sehr häufig fehleranfällig sein.

          Eben. Das _ahne_ ich ja. Deshalb meine Frage. Ich _weiß_ bloß nicht, wo überall solche Fehleranfälligkeiten liegen könnten. Es gibt eine Menge an "perldoc"-Hinweisen, es gibt unendlich viele einzelne verstreute Aussagen, aber alles, was ich bisher gelesen habe, hat mir letzten Endes keine wirklich befriedigende und vor allem umsetzbare "Lehrmeinung" geliefert. Es läuft immer ungefähr auf sowas hinaus: "probiers aus, und wenn du auf die Nase fällst, bist selbst dran schuld" :-(

          Grüße aus Berlin

          Christoph S.

          1. Hallo Christoph,

            Mit globalen Variablen sollte man IMHO *sehr* vorsichtig sein. Die
            Verwendung kann sehr häufig fehleranfällig sein.

            Eben. Das _ahne_ ich ja. Deshalb meine Frage. Ich _weiß_ bloß nicht,
            wo überall solche Fehleranfälligkeiten liegen könnten.

            Weil es keinen allgemeingültigen Satz dazu gibt. Ich bin dazu
            übergegangen, soweit wie eben möglich alle globalen Variablen zu
            vermeiden. Damit fahre ich eigentlich ganz gut. Manchmal ist das
            allerdings nicht möglich, da muss man dann halt Einschnitte machen.

            [...] aber alles, was ich bisher gelesen habe, hat mir letzten
            Endes keine wirklich befriedigende und vor allem umsetzbare
            "Lehrmeinung" geliefert.

            Die "Lehrmeinung" ist: globale Variablen sind zu vermeiden. So kriegt
            man das durch Profs und Lehrer beigebracht.

            Es läuft immer ungefähr auf sowas hinaus: "probiers aus, und wenn
            du auf die Nase fällst, bist selbst dran schuld" :-(

            Von mir hast du eher erhalten "Vermeide sie lieber, wenn möglich,
            Code kann an beliebiger Stelle wieder auftauchen. Und da wären
            globale Variablen scheisse."

            Grüße,
             CK

            --
            Ganz gleich, welchen Weg ich wähle, ich kehre heim.
    2. Hallo,

      Ist dein Programm eher weniger allgemein, spricht wenig dagegen, einige Variablen global zu handhaben - um mehr Übersichtlichkeit zu wahren. Das trifft insbesondere zu auf kurze Programme.

      Allerdings fangen die meisten größeren Programme auch einmal klein an, und DU weisst nie wirklich (ausser vielleicht bei 'Hello world'-Versuchen), wie groß ein kleines Programm einmal werden kann.
      Dumm dabei ist nur, dass die Größe dieser (kleinen) Programme meist unmerklich im Laufe der Zeit zunimmt. Wenn man also Deinem Vorschlag folgt, stellt sich für mich die Frage, wann der Zeitpunkt erreicht ist, dass aus einem kleinen Progamm, in dem sowieso alles wurscht ist, so groß geworden ist,  dass man wirklich sauber arbeiten muss.

      Eine "Schnittstelle" für eine eigene Funktion zu beschreiben, die man sicher nur einmal braucht, ist rausgeworfene Zeit.

      Auch hier drängt sich die Frage auf, ob man bei der ersten Verwendung einer Funktion schon entscheiden kann, dass man sie sicherlich nie wieder benötigen muss.

      Zu deinem Beispiel mit $cgi - in einem solchen Fall würde ich das CGI-Objekt global verwalten,

      Da stimme ich Dir zu, allerdings eigentlich nur deshalb, weil das CGI-Modul afaik nicht so aufgebaut ist, dass man mehrere Instanzen anlegen kann. Bei der Erzeugung der ersten Instanz sind die übergebenen Parameter( zumindest wenn HTTP-POST verwendet wurde) weg. Weitere Instanzen haben das nachsehen. (Wie gesagt: AFAIK. Wenn dem nicht so ist, bitte ich im Korrektur).

      allerdings diese nur in deinem Hauptquelltext abfragen, nicht in den Subroutinen.

      Naja, Objekt-Referenzen haben ja den Vorteil, als Parameter mit übergeben werden zu können;-)

      Grüße
        Klaus

  3. Hallo Christoph,

    wenn du use vars qw(foobar) benutzt, kannst du auch gleich use strict weglassen.

    CYa
    GONZO

    1. morgens Gonzo,

      wenn du use vars qw(foobar) benutzt

      Nee, ich benutze höchstens "use vars qw ($foobar)" *g*

      kannst du auch gleich use strict weglassen.

      Ups? Wieso das denn? Ich will mir ja grade größte Mühe geben, "use strict" und "use CGI" zu benutzen.
      Es ist eher anders herum: Wenn ich "use CGI" und "use strict" nicht verwende, ist "use vars qw()" eh gegenstandslos. Aber genau das will ich ja gar nicht.

      Grüße aus Berlin

      Christoph S.

    2. Hallo GONZO,

      wenn du use vars qw(foobar) benutzt, kannst du auch gleich use strict
      weglassen.

      Kannst du diese Aussage auch begründen?

      Grüße,
       CK

      --
      Sobald dir ein Gedanke kommt, lache über ihn.