Использование неинициализированного значения в unlink . . .

Я пишу скрипт, который проверяет наличие места на сервере и удаляет старые резервные копии, если места меньше 2 ГБ. Скрипт работает нормально, но поскольку я использую use strict; использовать предупреждения; в моем скрипте для моей практики эта ошибка выбрасывается.

Вот сценарий

#!/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 дней и приближался к текущей дате, поэтому, насколько я понял, для 1-й итерации цикла 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

person mviswa    schedule 19.03.2013    source источник
comment
Не чдирайте внешне. Используйте встроенную функцию Perl chdir: perldoc.perl.org/functions/chdir.html   -  person Andy Lester    schedule 21.03.2013


Ответы (2)


Если $backups[0] равно undef, это означает, что ваш glob не соответствует ни одному файлу (предположительно потому, что на этот день их нет). Если файлы не найдены, то unlink ничего делать не нужно.

Поэтому измените строку unlink на

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

or

unlink($backups[0]) if $backups[0];
person Dave Sherohman    schedule 19.03.2013

Если вы перепишете его немного по-другому, вы можете заставить Perl выполнять обнаружение:

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

Или даже

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

Но я думаю, что File::Find - это правильный подход к вашей проблеме.

person Zaid    schedule 19.03.2013
comment
Нет необходимости использовать unlink for @backups, просто используйте unlink @backups. На самом деле в некоторых системах вам, возможно, придется вызвать unlink более одного раза, чтобы получить все версии файл 1 while unlink @backups. - person Brad Gilbert; 21.03.2013