在Perl脚本中使用未初始化的值

时间:2013-09-10 15:44:10

标签: linux perl unix

我有以下程序来检查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

1 个答案:

答案 0 :(得分:2)

首先,始终将这些内容放入您的程序中:

use strict;
use warnings;

当您使用 strict 时,您必须使用myour声明变量(提示:您使用my约99.99%的变量时间)。

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

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

您的问题是您在知道文件是否存在之前尝试stat文件。您需要将stat放在if语句中,检查文件是否存在。

除了我上面所述之外,我做了一些改变:

  • 我使用say代替print。如果您使用print,则必须输入终止\nsay命令为您执行此操作。
  • 我在获得子程序后立即引入参数(并使用比$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;
}