2

In my main script, I am doing some archive manipulation. Once I have completed that, I want to run a separate script to upload my archives to and FTP server.

Separately, these scripts work well. I want to add the FTP script to the end of my archive script so I only need to worry about scheduling one script to run and I want to guarantee that the first script completes it work before the FTP script is called.

After looking at all the different methods to call my FTP script, I settled on 'do', however, when my do statement is at the end of the script, it never runs. When I place it in my main foreach loop, it runs fine, but it runs multiple times which I want to avoid since the FTP script can handle having multiple archives to upload.

Is there something I am missing? Why does it not run?

Here is the relivant code:

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";

Thanks

I ended up copying and pasting the FTP code into the main file as a sub. It works fine when I call it at the end of the foreach loop.

joejoeson
  • 1,107
  • 1
  • 10
  • 14
  • 1
    Hard to debug when can't see code. But I'm gonna guess that you have an exit up above the end of the loop. Maybe the code is so complex that it is not clear that you ever reach the end normally? – MJB Apr 06 '10 at 17:43
  • No, I do not have an exit anywhere in the code. In fact, I placed a print statement in the same location and it printed. – joejoeson Apr 06 '10 at 17:45
  • 1
    Jeremy - please provide a code sample (condensed). – DVK Apr 06 '10 at 17:48

3 Answers3

4

Check out the docs for the do 'function'.

In there, you'll find a code sample:

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;
}

I suggest putting this code in to find out what's happening with your do call. In addition, try adding warnings and strict to your code to weed out any subtle bugs.

Dancrumb
  • 26,597
  • 10
  • 74
  • 130
1

Add these lines to your scripts:

use strict;
use warnings;

You will now get more diagnostic information, which should lead you to the solution. My current bet is that you are not specifying the correct path to the other script, or that it is missing a shebang line.

Ether
  • 53,118
  • 13
  • 86
  • 159
0

What's the call to the new script? If using a shell, did you check your environment variables?

Tim Green
  • 2,028
  • 1
  • 17
  • 19