Lorenz: local() & flock()

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

  1. 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

    1. open DAT, '<file.txt' or die "$!";
      my $lines = do {lokal $/,<DAT>};

      Du meinst sicherlich local statt lokal.

      Peter

      1. Hallo Peter,

        my $lines = do {lokal $/,<DAT>};

        Du meinst sicherlich local statt lokal.

        tr/k,/c;/;

        Peter

        Danke
           Kai

  2. 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