我有以下程序来检查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
答案 0 :(得分:2)
首先,始终将这些内容放入您的程序中:
use strict;
use warnings;
当您使用 strict 时,您必须使用my
或our
声明变量(提示:您使用my
约99.99%的变量时间)。
这些将捕获脚本中的各种错误:
另外,使用缩进。它使您的脚本更容易阅读。在子程序内部输出也是不好的形式(除非这是子程序的目的。相反,让子程序返回(或不返回值),然后显示它。
您的问题是您在知道文件是否存在之前尝试stat
文件。您需要将stat
放在if
语句中,检查文件是否存在。
除了我上面所述之外,我做了一些改变:
say
代替print
。如果您使用print
,则必须输入终止\n
。 say
命令为您执行此操作。$numbera
和$numberb
更好的变量名称。if/then/else
而不是if
,然后unless
使用相同的测试。在大多数情况下,我不再使用unless
。说if ( 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;
}