我正在尝试组装一个脚本,该脚本将首先识别在文件夹下创建的最新日志文件,然后打开它并查找特定数据。基本上,我将查看此日志文件中的特定错误并将错误打印到新的日志文件中。
我了解如何执行排序以获取最新文件,但无法读取最新文件并将其复制到新日志文件
use File::stat;
$dirname = 'C:/Luntbuild_Logs';
$timediff = 0;
opendir DIR, "$dirname";
while ( defined( $file = readdir(DIR) ) ) {
if ( $file ne "." && $file ne ".." ) {
$diff = time() - stat("$dirname/$file")->mtime;
if ( $timediff == 0 ) {
$timediff = $diff;
$newest = $file;
}
if ( $diff < $timediff ) {
$timediff = $diff;
$newest = $file;
}
}
}
print $newest;
$file1 = "$dirname/$file";
open( FILE1, "<$newest" );
my (@fprint) = <FILE1>;
close FILE1;
open( FOUT, ">list1.txt" ) || die("Cannot Open File");
foreach $line (@fprint) {
print "$line" if $line =~ /> @/;
print "$line" if $line =~ /ORA-/;
print FOUT $line;
}
close FOUT;
答案 0 :(得分:2)
看起来你的错误可能就在这里:
open(FILE1,"<$newest");
您尝试打开没有包含路径的文件(readdir
仅返回文件名),这可能有效,也可能无效,具体取决于您当前的工作目录。
由于您没有检查open
语句的返回值,因此您不知道它是否失败。最有可能的是,您需要执行以下操作:
open FILE1, "<", "$dirname/$newest" or die $!;
始终检查所有open
和opendir
来电的返回值,因为它们可能会无声地失败。并且一定要包括:
use strict;
use warnings;
在您的脚本中,更正错误和警告。这是您最安全的预防措施,以防止难以发现错误。
答案 1 :(得分:2)
主要问题是您在$file1
中构建完整文件路径,但随后打开仅包含文件名的$newest
。
你真的应该通过
改进你的代码 始终在程序开始时使用use strict
和use warnings
,并在定义时使用my
声明所有变量
使用词法文件和目录句柄以及打开的三参数形式。始终测试开放状态并将$!
放在die
字符串中,以便您知道 失败的原因
永远不要在变量周围添加双引号,除非你知道它的作用,这就是你想要的
以下是对您的代码的重构,它遵循这些指南,并使用内置的-M
运算符来返回文件的年龄(
use strict;
use warnings;
my $dirname = 'C:/Luntbuild_Logs';
my ($newest_age, $newest_file);
opendir my $dh, $dirname or die $!;
while ( readdir($dh) ) {
my $file = "$dirname/$_";
next unless -f $file;
my $age = -M $file;
unless (defined $newest_age and $newest_age <= $age) {
$newest_age = $age;
$newest_file = $file;
}
}
print $newest_file, "\n";
open my $out,'>', 'list1.txt' or die "Cannot open file: $!";
open my $in, '<', $newest_file or die $!;
while (<$in>) {
print if /> \@/ or /ORA-/;
print { $out } $_;
}
close $out or die $!;
close $in or die $!;