在perl中读取最后修改的文件

read the last modified file in perl

如何在 perl 中读取目录中最后修改的文件的内容

我有一个接收短信的工具,我想用 perl 脚本给出最后修改的文件的内容,该文件存储在 gammu/inbox 目录中

例如:脚本检查文件夹(gammu/inbox)中是否有新短信,然后给出上一条短信的内容。

您需要使用

获取有序的文件列表
use File::DirList;
my @list = File::DirList::list('your_directory', 'M');

列表的第一个元素就是您要查找的内容。

您可以在此处阅读有关图书馆的更多信息File::DirList

根据每个文件的年龄对目录进行排序,使用 -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;
};