Quiq::FileHandle - Datei-Handle
Quiq::Object
Datei schreiben:
my $fh = Quiq::FileHandle->new('>',$path); $fh->print("Test\n"); $fh->close;
Datei lesen:
my $fh = Quiq::FileHandle->new('<',$path); while (<$fh>) { print; } $fh->close;
Ein Objekt der Klasse repräsentiert eine Dateihandle, über die Daten gelesen oder geschrieben werden können.
Zähler-Datei mit Locking:
my $fh = Quiq::FileHandle->open('+>>',$file,-lock=>'EX'); $fh->seek(0); my $count = <$fh> || "0\n"; chomp $count; $fh->truncate; $fh->print(++$count,"\n");
Siehe auch Quiq::LockedCounter.
$fh = $class->new($mode,$path,@opt); $fh = $class->new($globRef,@opt); $fh = $class->new('<'); # Lesen von STDIN $fh = $class->new('>'); # Schreiben nach STDOUT
open()
Erzeuge den Verzeichnispfad einer Datei, die geschrieben wird, falls er nicht existiert.
Locke die Dateihandle nach dem Öffnen im angegebenen Lock-Modus. Folgende Lockmodes werden unterschieden: 'SH' (shared lock), 'EX' (exclusive lock). Durch den Zusatz 'NB' (also Lockmode 'SHNB' der 'EXNB') wird die Operation "non blocking" ausgeführt, d.h. wenn der Lock nicht sofort erworben werden kann, wird eine Exception ausgelöst.
Wurde die Datei vom Konstruktor geöffnet, schließt er sie, wenn der Lock nicht erworben werden kann. Andernfalls bleibt die Dateihandle geöffnet.
Instantiiere Dateihandle-Objekt und liefere eine Referenz auf dieses Objekt zurück.
Filehandle-Objekt für STDOUT:
$fh = Quiq::FileHandle->new(\*STDOUT);
Lesen von STDIN:
$fh = $class->new('<'); $fh = $class->new('<',''); $fh = $class->new('<','-');
Schreiben nach STDOUT:
$fh = $class->new('>'); $fh = $class->new('>',''); $fh = $class->new('>','-');
$fh->destroy;
close()
Schließe Dateihandle. Die Methode liefert keinen Wert zurück. Nach Aufruf der Methode ist die Objektreferenz ungültig.
$data = $fh->read($n);
Lies die nächste die nächsten $n Zeichen von Dateihandle $fh und liefere diese zurück. Ist das Dateiende erreicht, liefere undef.
$data = $fh->readData;
Lies Daten in der Repräsentation
<LENGTH><DATA>
und liefere <DATA> zurück. <LENGTH> ist ein 32 Bit Integer und <DATA> sind beliebige Daten mit <LENGTH> Bytes Länge.
Wurden die Daten in einem Encoding wie UTF-8 geschrieben, müssen diese nach dem Einlesen anscheinend nicht dekodiert werden. Warum?
Wurden die Daten $data in einem Encoding wie UTF-8 geschrieben, müssen diese anschließend decodiert werden mit
Encode::decode('utf-8',$data);
Auf der FileHandle $fh das Encoding zu definieren, ist nicht richtig, da die Längenangabe diesem Encoding nicht unterliegt!
writeData()
$line = $fh->readLine;
Lies die nächste Zeile von Dateihandle $fh und liefere diese zurück. Schlägt dies fehl, wirf eine Exception.
@lines|$lineA = $fh->readLines($n);
Lies die nächsten $n Zeilen von Dateihandle $fh und liefere diese als Liste zurück. Der Zeilentrenner am Ende jeder Zeile wird entfernt. Im Skalarkontext liefere eine Referenz auf die Liste, wenn Zeilen gelesen wurden, sonst undef.
undef
Liefere Chunks von 1000 Pfaden:
my $fh = Quiq::FileHandle->new('-|',"find @$dirA -name '*.xml.gz'"); while (my $fileA = $fh->readLines(1000)) { ... } $fh->close;
$line = $fh->readLineChomp;
Lies die nächste Zeile von Dateihandle $fh, entferne den Zeilentrenner mit chomp() und liefere das Resultat zurück.
$line = $fh->readLineNoWhiteSpace;
Lies die nächste Zeile von Dateihandle $fh, entferne jeglichen Whitespace am Zeilenende (mit s/\s+$//) und liefere das Resultat zurück.
Diese Funktion ist nützlich, wenn verschiedene Zeilentrenner CRLF oder LF vorkommen können und Zeilen nur mit Whitespace zu Leerzeilen reduziert werden sollen.
$c = $fh->getc;
$data = $fh->slurp;
String
Lies den Rest von Dateihandle $fh liefere diesen zurück.
Die Methode ist nützlich, wenn der gesamte Inhalt einer Datei ab einer bestimmten Position gelesen werden soll.
Lies gesamten Inhalt einer Datei ab Position $pos:
my $fh = Quiq::FileHandle->open('<',$logFile); $fh->seek($pos); my $data = $fh->slurp;
$fh->print(@data);
write()
Schreibe Daten @data auf Dateihandle $fh. Die Methode liefert keinen Wert zurück.
$fh->writeData($data);
Schreibe die Daten $data in der Repräsentation
Hierbei ist <LENGTH> ein 32 Bit Integer, der die Länge der darauffolgenden Daten <DATA> in Bytes angibt.
Liegen die Daten $data in einem Encoding wie UTF-8 vor, müssen diese zuvor encodiert werden mit
Encode::encode('utf-8',$data);
readData()
$fh->truncate; $fh->truncate($length);
Kürze Datei auf Länge $length. Ist $length nicht angegeben, kürze Datei auf Länge 0.
$fh->seek($pos); $fh->seek($pos,$whence);
Setze die Position der Filehandle in der Datei. Die Methode liefert keinen Wert zurück. Genaue Funktionsbeschreibung siehe Perl-Dokumentation (perldoc -f seek).
$pos = $fh->tell;
Liefere die Position der Filehandle in der Datei. Genaue Funktionsbeschreibung siehe Perl-Dokumentation (perldoc -f tell).
$fh->lock($lockMode);
Locke die Datei im Lock-Modus $lockMode. Die Methode liefert keinen Wert zurück.
Folgende Lockmodes werden unterschieden:
shared lock
exclusive lock
shared lock, non-blocking
exclusive lock, non-bloking
Liefere "wahr", wenn der Lock gesetzt werden kann, im Fehlerfall liefere "falsch".
$fh->unlock;
Hebe Sperre auf Dateihandle $fh auf. Die Methode liefert keinen Wert zurück.
$fh = $fh->setEncoding($encoding);
FileHandle-Objekt (für Method-Chaining)
Definiere für Filehandle $fh das Encoding $encoding. D.h. alle Daten werden automatisch gemäß diesem Encoding beim Schreiben encodiert bzw. beim Lesen dekodiert.
Die Methode liefert keinen Wert zurück.
$fh->autoFlush; $fh->autoFlush($bool);
$fh->binmode; $fh->binmode($layer);
Schalte Filehandle in Binärmodus oder setze Layer $layer. Genaue Funktionsbeschreibung siehe Perl-Dokumentation (perldoc -f binmode).
$class->captureStderr(\$str);
Die Methode liefert keinen Wert zurrück
Fange alle Ausgaben auf STDERR ab und lenke sie auf Skalarvariable $str um.
$data = $class->slurpFromStdin;
Lies alle Eingaben von STDIN und liefere diese als eine Zeichenkette zurück.
1.143
Frank Seitz, http://fseitz.de/
Copyright (C) 2019 Frank Seitz
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Quiq, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Quiq
CPAN shell
perl -MCPAN -e shell install Quiq
For more information on module installation, please visit the detailed CPAN module installation guide.