在unlink中使用未初始化的值。 。 。

时间:2013-03-19 11:32:58

标签: perl unlink

我正在编写一个脚本来检查服务器中的空间并删除旧备份/ s的空间小于2 GB。脚本工作正常,但因为我使用严格;使用警告;在我的脚本中,为了我的练习目的,这个错误被抛弃了。

这是脚本

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

my @backups;
my $now=time();
my $dayago=10;

my (@space,@freesp);
@space=grep /\/dev\/md0/,`df`;

for(@space){
        chomp;
        @freesp=split /\s+/ ,$_;
        }

chdir '/home/ftpusr/backup' or die "Can't cd to backup dir: $!\n";

while (($freesp[3]/1024/1024 < 2.0) && ($dayago > 0)){
                my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now-$dayago*60*60*24);
                my $today_timestamp=sprintf("%4d%02d%02d",$year+1900,$mon+1,$mday);
                        @backups = glob("*NODE0000.CATN0000.$today_timestamp*");
                        #print "@backups\n";
                        $dayago -= 1;
                        #print "$dayago\n";
                        unlink ($backups[0]);
        }

我已将$ dayago参数初始化为10,以便它检查过去10天的备份并接近当前日期,因此据我所知,对于while循环的第一次迭代,它没有找到具有该特定文件的特定文件时空,所以它无法链接所以抛出这个警告。有什么办法可以消除这个警告吗?

这是我运行脚本时的O / P

    9
    Use of uninitialized value in unlink at purge3.pl line 26.

    8
    Use of uninitialized value in unlink at purge3.pl line 26.

    7
    Use of uninitialized value in unlink at purge3.pl line 26.

    6
    Use of uninitialized value in unlink at purge3.pl line 26.

    5
    Use of uninitialized value in unlink at purge3.pl line 26.

    4
    Use of uninitialized value in unlink at purge3.pl line 26.
    GSRTC.0.db2inst1.NODE0000.CATN0000.20130315102900.001
    3
    GSRTC.0.db2inst1.NODE0000.CATN0000.20130316150941.001 GSRTC.0.db2inst1.NODE0000.CATN0000.20130316171526.001
    2

    1
    Use of uninitialized value in unlink at purge3.pl line 26.
    GSRTC.0.db2inst1.NODE0000.CATN0000.20130318095532.001
    0

目录中的文件将被列出,我需要删除它们

GSRTC.0.db2inst1.NODE0000.CATN0000.20130315102900.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130316150941.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130318095532.001
AWDRT.0.db2inst1.NODE0000.CATN0000.20130319092156.001
GSRTC.0.db2inst1.NODE0000.CATN0000.20130319095258.001

2 个答案:

答案 0 :(得分:1)

如果$backups[0]undef,则表示您的glob与任何文件都不匹配(可能是因为当天没有任何文件)。如果没有找到文件,则无需unlink任何内容。

所以将unlink行更改为

unlink($backups[0]) if @backups;

unlink($backups[0]) if $backups[0];

答案 1 :(得分:1)

如果你稍微改写一下,你可以让Perl进行检测:

my @backups = glob "*NODE0000.CATN0000.$today_timestamp*";
unlink @backups;

甚至

unlink glob "*NODE0000.CATN0000.$today_timestamp*";  # No conditionals!

但我认为File::Find是解决问题的正确方法。