Perl读取每一行

时间:2013-12-03 03:02:22

标签: perl

我是Perl脚本的初学者。下面的脚本是检查文件修改时间是否大于600秒。我从filelist.txt读取文件名。

当我尝试打印文件修改时间时,它将修改时间显示为空白。

你能在我错的地方帮助我吗?

filelist.txt

a.sh
file.txt

Perl脚本

#!/usr/bin/perl

my $filename = '/root/filelist.txt';
open(INFO, $filename) or die("Could not open  file.");

foreach $eachfile (<INFO>)  {

    my $file="/root/$eachfile";
    my $file_timestamp = (stat $file)[9];
    my $timestamp = localtime($epoch_timestamp);
    my $startTime = time();
    my $fm = $startTime - $file_timestamp;
    print "The file modified time is = $file_timestamp\n";

    if ($rm > 600) {
        print "$file modified time is greater than 600 seconds";
    }
    else {
        print "$file modified time is less than 600 seconds\n";
    }
}

2 个答案:

答案 0 :(得分:3)

您没有包含use strict;use warnings;这是您的垮台。

你设置$fm;你测试$rm。这些变量不是同一个。使用限制和警告会指出你的方式的错误。专家经常使用它们以确保它们不会犯愚蠢的错误。初学者也应该使用它们来确保他们也不会犯愚蠢的错误。


这个修订过的剧本:

  • 使用use strict;use warnings;
  • 确保使用my
  • 定义每个变量
  • 不包含$epoch_timestamp$timestamp
  • 使用词法文件句柄($info)和open的三个参数形式
  • 关闭文件
  • 在邮件末尾包含换行符
  • Chomps从文件中读取的文件名
  • 打印文件名,以便可以看到chomp正在执行其中的内容
  • 找到当前目录中的文件而不是/root
  • 避免围绕die
  • 的参数括起来
  • die
  • 的参数中包含文件名
  • 可以通过在圈外移动my $startTime = time;进行优化
  • 在测试中使用$ fm
  • 如果大于/小于评论包含等于正确的情况
  • ,则可以改进

代码:

#!/usr/bin/perl
use strict;
use warnings;

my $filename = './filelist.txt';
open my $info, '<', $filename or die "Could not open file $filename";

foreach my $eachfile (<$info>)
{
    chomp $eachfile;
    my $file="./$eachfile";
    print "[$file]\n";
    my $file_timestamp = (stat $file)[9];
    my $startTime = time();
    my $fm = $startTime - $file_timestamp;
    print "The file modified time is = $file_timestamp\n";

    if ($fm > 600) {
        print "$file modified time is greater than 600 seconds\n";
    }
    else {
        print "$file modified time is less than 600 seconds\n";
    }
}
close $info;

切线:如果您在/root工作,则可能以用户root的身份运行。我相信你有很好的备份。编程为root的实验是一个危险的游戏。一个简单的错误可以消灭整个计算机,比你作为一个凡人用户(而不是像神一样的超级用户)运行时造成的伤害要大得多。

强烈建议:不要学习以root身份编程!

如果您忽略此建议,请确保您拥有良好的备份,并知道如何从中恢复。

(FWIW:我作为非root用户运行我的Mac;我甚至以非root用户身份运行系统升级。我偶尔会通过sudo或等价物使用root权限,但我从不登录{ {1}}。我没有必要这样做。我尽量减少花费root来减少造成伤害的可能性。我已经在Unix系统上工作了30年;我没有25年来发生根本特权事故,因为我很少以root身份工作。)

答案 1 :(得分:1)

其他人之前遇到的是,从文件INFO读取文件名,最后在字符串末尾添加换行符,然后尝试打开/root/file1<cr>不起作用因为那个文件不存在。

尝试致电:

chomp $eachfile

在构建$file

之前