1

我正在从另一台服务器获取一些日志文件(txt 格式)并尝试使用我的 Perl 脚本解析它们。正确获取日志之后,我将日志目录的权限设置为 777。

在此之后,我尝试通过我的 Perl 脚本一个一个地打开日志文件进行解析。现在,奇怪的事情和发生的问题是,我的脚本有时能够打开文件,有时却不能。简单来说就是有时无法打开日志文件进行解析。

此外,我已经 cronned 这个 perl 脚本,当它通过 cron 而不是手动运行时,文件打开失败的可能性更大,尽管它们以前在这两种情况下都成功运行。我不明白问题出在哪里。

这是我用来打开文件的代码,

$inputDir = "/path/to/dir";
@inputFiles = <$inputDir/*>;

# inputFiles array is list of files in the log directory
foreach my $logFile(@inputFiles)
{
    # just to ensure file name is text
    $logFile = $logFile."";

    # process file only if filename contains "NOK"
    if(index($logFile,"NOK") > -1)
    {
        # opens the file
        open($ifile, '<', $logFile) or die "Error: Unable to open file for processing.";

        # file parsing takes place
    }
}

close($ifile);

我想重申一下这段代码已经成功运行并且我没有改变它的任何部分。然而,它并非每次都运行无误,因为它有时无法打开日志文件。有任何想法吗?

4

3 回答 3

5

您应该在字符串中包含错误消息$!和文件名,以查看打开失败的原因以及针对哪个文件。$logFiledie

open($ifile, '<', $logFile) or die "Error: Unable to open $logFile: $!";

另外,这一行:

$logFile = $logFile."";

...是相当多余的。如果需要转换,perl 会处理它。

于 2013-01-16T07:18:28.863 回答
0

举个例子,你的代码应该是这样的。你可能想试试这个版本

use strict;
use warnings;

my $inputDir = '/path/to/dir';
my @inputFiles = <$inputDir/*>;

foreach my $logFile (grep /NOK/, @inputFiles) {
  open my $ifile, '<', $logFile or die qq(Unable to open "$logFile": $!);
  # Process data from <$ifile>;
}
于 2013-01-16T16:57:23.890 回答
-1

可能打开某些文件失败,因为您的程序打开的文件太多。您的程序打开所有文件$inputDir并在循环中处理它们。之后,它关闭最后打开的文件。

编辑:在阅读 TLP 的评论和阅读之后perldoc -f closeperldoc -f open我发现 TLP 是正确的,并且文件句柄$ifile被后续的open($ifile,'<',$logFile). 但是,如果主题创建者未显示的文件解析代码创建对文件句柄的另一个引用,$ifile则该文件句柄将保持打开状态。

将调用移动closeif块中应该可以解决您的问题:

$inputDir = "/path/to/dir";
@inputFiles = <$inputDir/*>;

# inputFiles array is list of files in the log directory
foreach my $logFile(@inputFiles)
{

    # process file only if filename contains "NOK"
    if(index($logFile,"NOK") > -1)
    {
        # opens the file
        # added my to $ifile to keep local to this scope
        open(my $ifile, '<', $logFile) or die "Error: Unable to open file for processing.";

        # file parsing takes place

        # close current file
        close($ifile);
    }
}
于 2013-01-16T08:53:50.220 回答