在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;
};
如何在 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;
};