Ich denke mal das was du benötigst ist in ungefähr das was "tail -f" macht.
#!/usr/bin/perl
use warnings;
use strict;
use IO::Handle;
open my $fh, '<', $ARGV[0] or die $!;
for (;;) {
while ( local $_ = <$fh> ) {
print;
}
sleep 1;
$fh->clearerr();
}
close $fh;
Die Auflösung von "sleep" ist hier aber nur Sekundengenau. Wenn du eine Auflösung im Millisekundenbereich benötigst musst du noch "use Time::HiRes" einbinden. Dann kannst du auch "sleep 0.1" schreiben für 100 Millisekunden. Das würde ich aber nicht machen, weil damit deine CPU Last ziemlich stark in die Höhe gesteigert wird.
Es gibt aber sicherlich auch andere Möglichkeiten das zu Lösen. z.B. mit der 4 Paramter Form von select(). Oder IO::Select damit bist du dann in der Lage das dein programm solange schläft bis auf irgendein handle Daten vorhanden sind. Und wenn es vorhanden ist, führst du etwas aus. Da müsste ich aber nochmal genau nachlesen wie das genau ging.
Allerdings dürfte dir:
perldoc IO::Select
oder
perldoc -f select
auch Informationen dazu geben. Mit der 4 paramterform von select() kannst du das selbe Implementieren was IO::Select macht. Nur ist IO::Select leichter.
\––\––
Ansonsten wenn du eher ein Programm schreiben möchtest wo du nur die letzten 100 Zeilen auslesen möchtest. Und dein Programm nicht die ganze Zeit Aktiv ist, dann ist Tie::File dein Freund. Der Zugriff auf "Tie::File" ist der selbe als wenn du eine Datei komplett in ein Array einlesen würdest. Der Unterschied ist jedoch, dass die Datei eben nicht im kompletten Speicher eingelesen wird.
Wenn du z.B. immer die letzten 100 Zeilen ausgeben möchtest, könntest du auch folgendes schreiben
#!/usr/bin/perl
use warnings;
use strict;
use Tie::File;
tie my @file, 'Tie::File', $ARGV[0] or die $!;
for ( 1..100 ) {
next if not defined $file[$_];
print $file[-$_], "\n";
}
untie @file;
Die gibt dann Rückwärts die letzten 100 Zeilen aus. Also die letzte Zeile steht zuerst, dann kommt die zweitletzte etc. Dabei wird nie die ganze Datei eingelesen. Du könntest damit also auch eine 5GB Datei öffnen. Worauf du aber achten musst ist das du die Datei direkt bearbeitest.
Wenn du
push @file, "Hallo, Welt!";
schreibst fügst du damit automatisch eine Zeile am ende der Datei hinzu.
Mit
unshift @file, "Hallo, Welt!";
fügst du eien Zeile direkt am anfang hinzu. mit
my $line = shift @file
würdest du die erste Zeile aus der Datei löschen etc.
Die Datei ist halt ein normales Array mit dem du alles machen kannst, alle veränderungen am Array bearbeiten aber die Originaldatei direkt.
P.S:
Da es immer öfter vorkommt.
Es gibt kein "PERL", es wird "Perl" geschrieben, und wenn du die PVM meinst wird es "perl" geschrieben. 😉