2016-04-09 82 views
0

我怎麼能讀的最後修改文件的目錄中的perl內容閱讀Perl的最後一次修改的文件

我有收到手機短信的工具,我想給出來的最後修改文件的內容,它存儲在gammu/inbox目錄中,用一個perl腳本

例如:腳本檢查一個新文件夾(gammu/inbox)是否是他們,然後發出最後一個短信的內容。

回答

2

排序根據年齡的每個文件,使用-M文件測試操作的目錄。最近修改的文件將成爲列表中的第一個

該程序顯示了原理。它找到當前工作目錄中的最新文件,打印它的名稱並打開它的輸入

如果您想對cwd以外的其他目錄執行此操作,那麼對chdir而言,最簡單的方法是使用此代碼而不是試圖opendir特定的目錄,那麼你將要興建的完整路徑每個文件可以使用-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: $!}; 

之前,如果你是一個相當大的目錄中工作,那麼這可能需要一些時間爲stat操作很慢。您可以通過使用的Schwartzian變換所以提高這個有很多是stat爲每個文件

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]; 
}; 

如果你想要的東西真的快的話,只是做了文件的單次調用一次,保持跟蹤迄今爲止發現的最新信息。像這樣

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

與此腳本我看到最後的短信,然後我收到但不是這個短信的內容。謝謝 – perlfg

+1

@perlfg:你需要告訴如何打開一個文件並打印它嗎? – Borodin

+0

否:)我經常收到短信,並用perl迴應最後一條短信的內容 – perlfg

0

你需要讓文件的有序列表與

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

比列表的第一個元素是你在找什麼。

您可以在此處詳細瞭解圖書館File::DirList

+0

這不會有很多原因。你顯然沒有測試過它。 – Borodin

+0

是的,它不起作用 – perlfg