2014-10-20 5 views
0

Я довольно новичок в Perl, но я предполагал, что имел в виду основы, такие как определение переменных и область видимости ... но, похоже, это не так. Моя проблема заключается в том, что я держу на натыкаясь ошибки:Perl: Глобальный символ «% s» требует явного имени пакета

Global symbol "$save_from_date" requires explicit package name at myMover.pl line 40

У меня есть функция, в которой я намерен сравнить дату файла по сравнению с другой даты (по умолчанию или аргумент), но это не удается.

Вот хлопотно код, экстракт:

# Process source directory 
sub ParseSource { 
    my $file = $_; 
    my $filedate = localtime((stat $file)[9])->ymd(''); 
    if ($filedate >= $save_from_date) { 
     print "[To Archive] $file"; 
    } 
} 

# Default Values 
my $source_directory  = 'C:\Users\Public\Documents'; 
my $destination_directory = 'C:\Users\Public\Documents\Archive'; 
my $save_from_date  = strftime "%Y%m%d", localtime; 
my ($verboseornotverbose, $display_help) = undef; 

GetOptions(
    "verbose!"   => \$verboseornotverbose, 
    "help|h!"    => \$display_help, 
    "source_dir|s:s"  => \$source_directory, 
    "destination_dir|d:s" => \$destination_directory, 
    "date|t:i"   => \$save_from_date 
); 

usage() if $display_help; 

# Basic checks 
unless (-d $source_directory) { die "ERROR -- Source directory [$source_directory] does not exists" } 
unless (-d $destination_directory) { 
    unless (mkdir $destination_directory) { 
     die "ERROR -- Destination directory $destination_directory does not exists and couldn't be created'"; 
    } 
} 
unless ($save_from_date <= strftime "%Y%m%d", localtime) { 
    die "ERROR -- Wrong or unknown date format [$save_from_date] should be before or equal today\'s' date'"; 
} 
print $save_from_date ; 

# Here we parse the source directory 
find(\&parseSource, $source_directory); 

Это сравнение, которое не удается: if ($filedate >= $save_from_date)

Не могли бы вы объяснить мне, что я пропустил в этом суб?

Я прочитал множество других постов и некоторые учебники определения переменных, но я не мог получить ключ от моей проблемы ...

Спасибо!

+3

Определения функций , –

ответ

6

Переменная не объявляется, когда подэлемент разбирается. Либо переместите объявление переменной до суб, либо передайте переменную в sub в качестве параметра.

Обновление: Вы не можете передавать параметры непосредственно в wanted в File::Find. Но, вы можете обернуть его в анонимных подразделах:

sub parseSource { 
    my $save_from_date = shift; 
    # ... 
} 

# ... 

find(sub { parseSource($save_from_date) }, $source_directory); 
+2

Добавить код для +1. – toolic

+0

Спасибо! Это было все просто ... думал, что Perl вел себя как скрипт оболочки, и я мог определить подпрограммы/функцию, а затем использовать его независимо от глобальных переменных, которые я буду использовать ... Я догадывался неправильно. Очень важно, я думаю, что продолжу читать некоторые уроки ... – Maxime

+4

Если вы отключите «строгие» и «предупреждения», вы можете делать всевозможные грязные вещи, которые будут работать в основном. За исключением случаев, когда они этого не делают, и у вас будет ужасная работа, отслеживающая его и выяснение причин. – Sobrique

0

Как уже пояснялись, вы должны объявлять переменные перед их использованием внутри подпрограмм.

Я хотел бы также, чтобы продемонстрировать, что вы можете упростить GetOptions код инициализации их и передать ссылку на ту же стадии: должно быть расположено после заявлений глобальных переменных, которые они используют

GetOptions(
    "verbose!"   => \(my $verboseornotverbose), 
    "help|h!"    => \(my $display_help), 
    "source_dir|s:s"  => \(my $source_directory = 'C:\Users\Public\Documents'), 
    "destination_dir|d:s" => \(my $destination_directory = 'C:\Users\Public\Documents\Archive'), 
    "date|t:i"   => \(my $save_from_date = strftime "%Y%m%d", localtime), 
); 

usage() if $display_help; 

# Basic checks 
die "ERROR -- Source directory [$source_directory] does not exists" 
    unless -d $source_directory; 

mkdir $destination_directory 
    or die "ERROR -- Destination directory $destination_directory does not exists and couldn't be created'" 
    unless -d $destination_directory; 

die "ERROR -- Wrong or unknown date format [$save_from_date] should be before or equal today\'s' date'" 
    unless $save_from_date <= strftime "%Y%m%d", localtime; 

# Process source directory 
sub ParseSource { 
    my $file = $_; 
    my $filedate = localtime((stat $file)[9])->ymd(''); 
    if ($filedate >= $save_from_date) { 
     print "[To Archive] $file"; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^