Klaus Mock: Ich versteh die Logik hierbei nicht

Beitrag lesen

Hallo,

my $verzeichnis = '.'; # wobei noch anzmerken ist, das das aktuelle Verzeichnis nicht wirklich definiert ist
wieso eigentlich nicht ?

Weil im Webumfeld es nicht sicher ist, daß das aktuelle Verzeichnis beim Scriptaufruf auch dort ist, wo Du es erwartest.

und zu use strict : Ich hab jetzt mal das use strict beibehalten, aber ich habs nie verwendet weil ich nie weis wann man my setzen muss, immer nur am Anfang ? Ich bild mir ein ich hab mal wo gesehen, daß mitten im Script auch ein my vorgekommen is, oder nicht ?

Kurze Antwort:

Du kannst my verwenden, wann Du willst, nicht nur am Anfang. In jedem Fall mußt Du, es in Verbindung mit 'use script', vor, oder spätestens bei, der ersten Verwendung der Variable benutzen.

Längere Antwort:

my bestimmt eigentlich den Gültigkeitsbereich einer Variable. Wenn Du eine Variable mittels my innerhalb eines Blocks deklarierst, dann ist diese Variable auch nur innerhalb dieses Blocks 'vorhanden', also gültig).
eigentlich kannst Du jederzeit eine neue Variable mit my einführen, sie gilt eben bis zum Ende des Blocks.
Wird eine Variable nicht innerhalb eines Blocks definiert, dann gilt sie ab dem Zeitpunkt der Definition innerhalb der restlichen Scriptdatei, aber nur innerhalb dieser Scriptdatei. Das ist vor allem bei der Modulentwicklung wichtig.
Einen Block erkennst Du an den geschwungenen Klammern, welche Anweisungen einfassen, nicht zu verwechseln mit den Klammern, die Du bei Hashes verwendest.

Beispiel:

#!/usr/bin/perl -w
use strict;

ab sofort müssen Variablen deklariert sein

zu diesem Zeitpunkt gibt es eigentlich nur die, die 'vordefiniert' sind

also b.B. $_, $!, $|, %ENV usw.

Du kannst einfach Variablen definiert:

my $zeile;

hier könnten beliebige Anweisunge stehen, welche auf $zeile zugreifen können

aber nicht auf $dateiname, da sonst einf Fehler produziert werden würde

Du kannst auch Variablen gleich mit Werten vorbelegen:

my $dateiname = '/wo/auch/immer/wasauchimmer.txt';

open(IN,$dateiname);

hier gibts noch kein @werte

while($zeile = <IN>)
  { # hier beginnt ein Block
  chomp $zeile; # auch innerhalb dieses Blocks ist $zeile das gleiche wie außerhalb

my(@werte) = split(';',$zeile); #  ab hier ist @werte deklariert, und gilt bis zum Ende des Blocks
  # weitere Anweisungen
  } # hier endet der Block

hier gibts @werte wieder nicht, wohl aber noch $zeile, $dateiname

Hilfreich ist my unter anderem auch, weil Du in einem Block Variablen verwenden kannst, unabhängig davon, ob sie außerhalb schon verwendet werden oder nicht.

Beispiel:

my $zeile = 'wasauchimmer';

print $zeile; # gibt 'wasauchimmer' aus, da $zeile so belegt wurde

if(-e $dateiname)
  {
  open(IN,$dateiname);
  my $zeile; # hier wird $zeile für den Block neu definiert
  print $zeile; # gibt einen leeren String aus, da $zeile in diesem Block noch leer ist

while($zeile = <IN>)
    {
    print $zeile; # gibt den inhalt der Datei zeilenweise aus
    }
  }

print $zeile;

gibt wieder 'wasauchimmer' aus, unabhängig davon,

was in der Datei stand

Das ist vor allem beim Schreiben von Funktionen ein äußerst hilfreiches Verhalten.

Du siehst, my ist nicht nur zur Vermeidung von Fehlermeldungen bei 'use strict' interessant, sondern auch für viele andere interessante Anwendungsfälle.

Seit Perl 5.6 gibt es auch 'our', wodurch es auch möglich wurde, wirklich globale Variablen zu deklarieren. Bei frühere Versionen von Perl mußte man sich entscheiden, ob man 'use strict', oder globale Variablen verwenden wollte.
In den meisten Fällen sind globale Variablen zwar unsauber, aber ab und zu kann man damit eine Sache dann doch eleganter lösen, unabhängig davon, was Puristen davon halten.

Es gibt da noch eine Funktionalität, deren Verhalten zwar 'my' nicht unähnlich ist, aber intern vollkommen anders arbeitet. Ich rede hier von 'local'.  Aber Du solltest Dich nicht mehr damit abgeben, da es IMHO noch ein Relikt aus vergangenen Tagen ist. Ich wollte es nur der Vollständigkeit halber erwähnt haben.

Jetzt hoffe ich, daß ich etwas Licht in die Sache gebracht habe, ohne vollständig zu verwirren.

Grüße
  Klaus