0

我正在尝试组装一个脚本,该脚本将首先识别在文件夹下创建的最新日志文件,然后打开它并查找特定数据。基本上,我将在此日志文件中查找特定错误并将错误打印到新日志文件中。

我了解如何执行排序以获得最新文件,但在读取最新文件并将其复制到新日志文件时遇到问题

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;
4

2 回答 2

2

看起来你的错误可能在这里:

open(FILE1,"<$newest");

您尝试打开不包含路径的文件(readdir仅返回文件名),这可能有效也可能无效,具体取决于您当前的工作目录。

由于您不检查open语句的返回值,因此您不知道它是否失败。最有可能的是,您需要执行以下操作:

open FILE1, "<", "$dirname/$newest" or die $!;

open始终检查 all和调用的返回值opendir,因为它们可能会默默地失败。并确保包括:

use strict;
use warnings;

在您的脚本中,并更正错误和警告。这是针对难以检测的错误的最安全的预防措施。

于 2012-08-22T13:32:26.733 回答
2

主要问题是您在其中构建了完整的文件路径,$file1但随后打开$newest了仅包含文件名的路径。

你真的应该改进你的代码

  • 始终在程序的开头使用use strictand ,并在定义时声明所有变量use warningsmy

  • 使用词法文件和目录句柄以及 open 的三参数形式。始终测试打开的状态并放入$!字符串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 $!;
于 2012-08-22T14:07:09.963 回答