2016-04-09 6 views
0

Wie kann ich den Inhalt der zuletzt geänderte Datei in einem Verzeichnis in Perl lesenlesen die letzte geänderte Datei in Perl

ich ein Tool für empfangene SMS und ich möchte den Inhalt der zuletzt geänderte Datei geben, , die in gammu/inbox-Verzeichnis gespeichert ist, mit einem Perl-Skript

zum Beispiel: das Skript überprüft, ob eine neue SMS in Ordner (gammu/inbox), sind sie, dann geben Sie den Inhalt von den letzten SMS.

Antwort

2

sortiert das Verzeichnis, in das Alter von jeder Datei nach, mit dem -M Dateitestoperator. Die zuletzt geänderte Datei ist dann die erste in der Liste

Dieses Programm zeigt das Prinzip. Es findet die neueste Datei im aktuellen Arbeitsverzeichnis, druckt seinen Namen und öffnet es zur Eingabe

Wenn Sie dies für ein anderes Verzeichnis als das cwd tun möchten, dann ist es wahrscheinlich am einfachsten, nur chdir zu verwenden und diesen Code zu verwenden als zu opendir ein bestimmtes Verzeichnis zu versuchen, wie dann werden Sie den vollständigen Pfad zu jeder Datei erstellen müssen, bevor Sie -M

use strict; 
use warnings 'all'; 
use feature 'say'; 

my $newest_file = do { 
    opendir my $dh, '.' or die $!; 
    my @by_age = sort { -M $a <=> -M $b } grep -f, readdir $dh; 
    $by_age[0]; 
}; 

say $newest_file; 

open my $fh, '<', $newest_file or die qq{Unable to open "$newest_file" for input: $!}; 

Wenn Sie arbeiten mit einem umfangreichen Verzeichnis kann als einige Zeit, dann nehmen kann dies stat Betrieb ist ziemlich langsam. Sie können durch die Verwendung eines dieser viel verbessern Schwartzian Transformation, so dass stat nur einmal für jede Datei aufgerufen wird

my $newest_file = do { 

    opendir my $dh, '.' or die $!; 

    my @by_age = map $_->[0], 
    sort { $a->[1] <=> $b->[1] } 
    map [ $_, -M ], readdir $dh; 

    $by_age[0]; 
}; 

Wenn Sie etwas wollen wirklich schnell, dann nur einen einzigen Durchlauf der Dateien, Aufbewahrung Spur der neuesten bisher gefundenen. So funktioniert

my $newest_file = do { 

    opendir my $dh, '.' or die $!; 

    my ($best_file, $best_age); 

    while (readdir $dh) { 

     next unless -f; 
     my $age = -M _; 

     unless (defined $best_age and $best_age < $age) { 
      $best_age = $age; 
      $best_file = $_; 
     } 
    } 

    $best_file; 
}; 
+0

mit diesem Skript sehe ich die letzte SMS, dann habe ich aber nicht den Inhalt dieser SMS erhalten. Danke – perlfg

+1

@perlfg: Müssen Sie gesagt werden, wie man eine Akte öffnet und sie druckt? – Borodin

+0

nein :) Ich bekomme ständig SMS und würde den Inhalt der letzten SMS mit Perl wiedergeben – perlfg

0

Sie benötigen eine geordnete Liste von Datei erhalten mit

use File::DirList; 
my @list = File::DirList::list('your_directory', 'M'); 

als das erste Element der Liste ist, was Sie suchen.

Sie können mehr über die Bibliothek lesen Sie hier File::DirList

+0

Dies wird aus vielen Gründen nicht funktionieren. Du hast es eindeutig nicht getestet. – Borodin

+0

ja, es funktioniert nicht – perlfg

Verwandte Themen