Оператор do в конце моего сценария perl никогда не запускается

В моем основном скрипте я проделываю некоторые манипуляции с архивом. Как только я это закончу, я хочу запустить отдельный скрипт для загрузки моих архивов на FTP-сервер.

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

Посмотрев на все различные методы вызова моего FTP-скрипта, я остановился на do, однако, когда мой оператор do находится в конце скрипта, он никогда не запускается. Когда я помещаю его в свой основной цикл foreach, он работает нормально, но запускается несколько раз, чего я хочу избежать, поскольку сценарий FTP может обрабатывать несколько архивов для загрузки.

Что-то мне не хватает? Почему не запускается?

Вот соответствующий код:

chdir $input_dir;
@folder_list = <*>;
foreach $file (@folder_list)
{
    if($file =~ m/.*zip/)
    {
    print "found $file\n";
    print "Processing Files...\n";
        mkdir 'BuildDir';
        $new_archive = Archive::Zip->new();
        $archive_name = $file;
        $zip = Archive::Zip->new($file);
        $zip->extractTree('', $build_dir);
        &Process_Files;
    }
}
do 'ArchiveToFTPServer.pl';
print "sending files to FTP server";

Спасибо

Я закончил тем, что скопировал и вставил код FTP в основной файл в качестве подпрограммы. Он отлично работает, когда я вызываю его в конце цикла foreach.


person joejoeson    schedule 06.04.2010    source источник
comment
Трудно отлаживать, когда не вижу кода. Но я предполагаю, что у вас есть выход выше конца петли. Может быть, код настолько сложен, что непонятно, дойдете ли вы до конца нормально?   -  person MJB    schedule 06.04.2010
comment
Нет, нигде в коде нет выхода. Фактически, я поместил оператор печати в то же место, и он распечатал.   -  person joejoeson    schedule 06.04.2010
comment
Джереми, пожалуйста, предоставьте образец кода (сокращенный).   -  person DVK    schedule 06.04.2010


Ответы (3)


Ознакомьтесь с документацией по do 'функции'.

Там вы найдете образец кода:

unless ($return = do $file) {
  warn "couldn't parse $file: $@" if $@;
  warn "couldn't do $file: $!" unless defined $return;
  warn "couldn't run $file" unless $return;
}

Я предлагаю вставить этот код, чтобы узнать, что происходит с вашим do вызовом. Кроме того, попробуйте добавить в код warnings и strict, чтобы отсеять любые незаметные ошибки.

person Dancrumb    schedule 06.04.2010

Добавьте эти строки в свои скрипты:

use strict;
use warnings;

Теперь вы получите дополнительную диагностическую информацию, которая должна привести вас к решению. Моя текущая ставка заключается в том, что вы не указываете правильный путь к другому сценарию или что в нем отсутствует строка shebang.

person Ether    schedule 06.04.2010
comment
сценарий является локальным по отношению к основному сценарию. Линия шебанга, вероятно, верна. позвольте мне попробовать это и вернуться к вам. - person joejoeson; 06.04.2010
comment
Однако есть одна проблема с этим решением: оно не объясняет, почему выполняется статус do, если я помещаю его перед блоком foreach. - person joejoeson; 06.04.2010
comment
Я только что посмотрел. там есть шебанг. - person joejoeson; 06.04.2010
comment
@Jeremy: что-то в цикле for прерывает ваш скрипт, но вы должны лучше понять, что происходит с включенными строгими проверками и предупреждениями. - person Ether; 06.04.2010
comment
Все, что было в строгом смысле этого слова, - это жаловаться на то, что я не назначаю имена своим переменным. - person joejoeson; 06.04.2010

Какой призыв к новому сценарию? Если вы используете оболочку, вы проверяли переменные среды?

person Tim Green    schedule 06.04.2010