Guest Henry>* open mit 3 Parametern
> check auf open
Meinst du mit check auf open '..|| die "kann file $file nicht lesen !!"'
oder gibt es sonst noch einen 3. Parameter, die man abrufen muss ?
Was das
open mit Drei Parametern betrifft. Man sollte es immer benutzen, da es sicherer ist. Also
"open Variable, Datenrichtung, Dateiname". Wenn man
open($var,$file) schreibt kann auch
"> /pfad/zu/einer/wichtigen/datei.conf" in
$file stehen. Damit Lassen sich beliebige Dateien leeren oder Programme ausführen, selbst wenn davon nur gelesen wird. Weiterhin ist es einfacher die Korrektheit eines Pfads zu prüfen wenn kein
"<>|-" enthalten sein darf. Auch
open($var,"<$file") ist nicht viel besser. Da lässt sich immer noch ein
open($var,"<+$file") daraus machen. Außerdem kann bei einigen Betriebssystemen
"<name.txt" ein korrekter Dateiname sein.
Guest Henry>* Filehandle nicht global
Warum, nur so kann ich doch aus einer Sub zugreifen, oder ?
>Eine parse funktion ohne Parameter ist vorsätzliche Gegnerverwirrung
Der Vortei ist wohl, dass man sofort die übergebenen variablen sieht ?
>Man schreibts auch ohne &
Oha, das würde ich dann vielleicht mit einem Label verwechseln. Was
ist der Vorteil es ohne & zu schreiben ?
Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
my @parsed_data;
{
open(my $fh, '<', $file) or die "Can't open $file ($!)\n";
@parsed_data=parse($fh, fast => 1, lazy => 0);
close($fh);
}
sub parse
{
my $handle=shift(@_);
my %options=@_;
my @data;
if($options{fast})
{
}
return @data;
}
Wenn man normale Variablen als FileHandles benutzt kann man sie an Funktionen übergeben. Der Vorteil ist das Funktionen damit sehr viel portabler werden. Weiterhin werden solche Filehandles automatisch geschlossen, wenn sie gelöscht werden (verlassen des Gültigkeitsbereichs).
Wenn du Funktionen mit
& aufrufst sagst du perl: "Ich bin Experte, ich weiß was ich mache. Auch wenn hier Müll zu stehen scheint kümmere dich nicht darum. Und erzeuge keine Kopie von
@_, welche an die Funktion übergeben wird" Aus dem Grund sollten unerfahrene Programmierer
&funktion nicht nutzen. Wer das alles nicht weiß wundert sich leicht über das seltsame verhalten von Perl. Besser ist es
funktion() zu schreiben, oder
funktion($param1, $param2, ...) wenn man Werte übergeben will.
Nebenbei Perl erlaubt es auch Werte wider zurück zu geben. Das kapselt die Funktion noch weiter.