-1

我有以下程序用于检查 Unix 目录中的文件可用性。

my $numbera = "c://";
my $numberb = "test1.txt";
check_file_exist($numbera, $numberb);

sub check_file_exist {
    my $download_filename;
    my ($numbera,$numberb) = @_;
    $download_filename = $numbera.$numberb;
    print "*** $download_filename ****";
    my $mtime = (stat $download_filename)[9];
    my $filedatetime = scalar localtime $mtime;

    if (-e $download_filename) {
        print "Data File Exist which is created on $filedatetime";
    }
    unless (-e $download_filename) {
        print "File not exists";
    }
}

运行程序时出现以下错误:

*** data_file=HASH(0xa912f0)/home1/saravanan/ ****
Use of uninitialized value in localtime at /home1/saravanan/data_file.pl
4

1 回答 1

2

首先,总是把这些放在你的程序中:

use strict;
use warnings;

当你使用strict时,你必须使用myor来声明你的变量our(提示:你使用my大约 99.99% 的时间)。

这些将捕获脚本中的各种错误:

另外,使用缩进。它使您的脚本更易于阅读。在子例程内部输出也是不好的形式(除非这是您的子例程的目的。相反,让您的子例程返回(或不返回值),然后显示它。

stat您的问题是您在知道文件是否存在之前就尝试了该文件。您需要将您statif声明放在您检查文件是否存在的地方。

除了上面所说的之外,我还做了一些更改:

  • 我使用say而不是print. 如果你使用print,你必须放入一个终止符\n。该say命令为您执行此操作。
  • 我一得到子例程就拉入我的参数(并使用比$numberaand更好的变量名$numberb
  • 我使用相同的测试而不是先做一个然后if/then/else再做一个。在大多数情况下我不再使用。说起来更清楚。ifunlessunlessif ( not ... )
  • 该子例程要么返回一个日期戳,要么什么也不返回。我用我的if语句检查子例程的返回值。

这是您的程序更新了一点:

use warnings;
use strict;
use autodie;
use feature qw(say);
use Data::Dumper;

my $numbera = "/Users/david";
my $numberb = ".profile";

if ( my $timestamp = check_file_exist( $numbera, $numberb ) ) {
    say "The file was downloaded at $timestamp";
}
else {
    say "The file does not exist";
}

sub check_file_exist {
    my $directory = shift;
    my $file_name = shift;

    my $download_filename = "$directory/$file_name";

    my @stat = stat($download_filename);
    if (not @stat) {
         return;
    }
    my $mtime = $stat[9];
    return scalar localtime $mtime;
}
于 2013-09-10T16:05:14.523 回答