local() & flock()
Lorenz
- perl
Hallo
beim durchstöbern von qelltexten bin ich auf folgendes gestoßen:
open (ID , "<id.txt" );
&LockFile(ID) ;
[...]
close (ID) ;
sub LockFile
{
local(*DATEI=@_) ;
if ($lock==1)
{
flock(DATEI,2);
}
}
hierduch soll der gemeinsamme zugriff auf id.txt verhindert werden.
ABER was bewirkt local und flock genau ????
wäre nett wenn mir das einer erklären könnte, oder mir ne page sagen könnt, auf der ich das nachlesen könnt.
Danke
Lorenz
Hallo Lorenz,
Hallo
beim durchstöbern von qelltexten bin ich auf folgendes gestoßen:
open (ID , "<id.txt" );
&LockFile(ID) ;
[...]
close (ID) ;sub LockFile
{
»» local(*DATEI=@_) ;
»» if ($lock==1)
»» {
flock(DATEI,2);
»» }
}
hierduch soll der gemeinsamme zugriff auf id.txt verhindert werden.
ABER was bewirkt local und flock genau ????
wäre nett wenn mir das einer erklären könnte, oder mir ne page sagen könnt, auf der ich das nachlesen könnt.
flock:
< http://www.worldmusic.de/perl/dclpc-faq.html>
"Wie kann ich Dateien vor mehrfachen Zugriff schuetzen ?"
local => dynamisches scoping.
Variablen, die mit local deklariert werden, erhalten innerhalb des umschliessenden Blockes einen lokalen Wert, bleiben aber global. Wird der Block verlassen, wird der alte Wert wieder hergestellt. Haeufig will man lieber "my" (lokale Variable) verwenden.
perldoc -f my
Eine Anwendung fuer local ist z.B., der sog. slurp-mode:
Will man den Inhalt einer Datei, in einen String einlesen und nicht wie ueblich in ein Array, so kann man dies so tun:
#!/usr/bin/perl -w
use strict;
open DAT, '<file.txt' or die "$!";
my $lines = do {lokal $/,<DAT>};
die globale Variable $/ (Input Record Seperator), wird lokal mit undef ueberschrieben, nach verlassen des do-Blockes erhaelt $/ den alten Wert zurueck.
close DAT;
Danke
Lorenz
Gruss
Kai
open DAT, '<file.txt' or die "$!";
my $lines = do {lokal $/,<DAT>};
Du meinst sicherlich local statt lokal.
Peter
Hallo Peter,
my $lines = do {lokal $/,<DAT>};
Du meinst sicherlich local statt lokal.
tr/k,/c;/;
Peter
Danke
Kai
Hallo Lorenz,
Hallo
beim durchstöbern von qelltexten bin ich auf folgendes gestoßen:
#!/usr/bin/perl -w
use strict;
use Fcntl ':flock';
open (ID , "<id.txt" );
open (ID , "<id.txt" ) or die "open id.txt: $!";
&LockFile(ID) ;
[...]
flock (ID,LOCK_SH) or die "flock id.txt: $!" if $lock == 1;
[...]
close (ID) ;
close (ID) or die "close id.txt: $!";
sub LockFile
{
»» local(*DATEI=@_) ;
»» if ($lock==1)
»» {
flock(DATEI,2);
»» }
}
Ein Unterroutinenaufruf macht hier (IMHO) keinen Sinn.
local ist hier nicht das, was der Author meint.
Mann sollte aus Portablitätsgründen immer die Platzhalter (LOCK_SH,...) für das flocking benutzen.
Danke
Lorenz
Gruß
Kai