wie sinnvoll ist "use vars qw();" ?
Christoph Schnauß
- perl
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.
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
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);
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.
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
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.
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
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
Hallo Christoph,
wenn du use vars qw(foobar) benutzt, kannst du auch gleich use strict weglassen.
CYa
GONZO
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.
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