【问题标题】:A 'do' statement at the end of my perl script never runs我的 perl 脚本末尾的“do”语句永远不会运行
【发布时间】:2011-02-04 22:21:12
【问题描述】:

在我的主脚本中,我正在做一些存档操作。完成后,我想运行一个单独的脚本将我的档案上传到 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 循环结束时调用它时它工作正常。

【问题讨论】:

  • 看不到代码时很难调试。但我猜你在循环结束的上方有一个出口。也许代码太复杂以至于不清楚你是否能正常到达终点?
  • 不,我在代码中的任何地方都没有出口。事实上,我在同一个位置放置了一个打印语句并打印出来了。
  • Jeremy - 请提供代码示例(精简版)。

标签: perl ftp archive


【解决方案1】:

查看the docs for the do 'function'。

在那里,您会找到一个代码示例:

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 以清除任何细微的错误。

【讨论】:

    【解决方案2】:

    将这些行添加到您的脚本中:

    use strict;
    use warnings;
    

    您现在将获得更多诊断信息,这些信息将引导您找到解决方案。我目前的赌注是您没有指定其他脚本的正确路径,或者它缺少 shebang 行。

    【讨论】:

    • 脚本是主脚本的本地脚本。 shebang线可能是正确的。让我试试,然后回复你。
    • 虽然该解决方案存在一个问题,但它没有解释为什么如果我将 do 语句放在 foreach 块之前会执行它。
    • 我刚看了。 shebang就在那里。
    • @Jeremy:for 循环中的某些内容正在中止您的脚本,但您应该更好地了解启用严格检查和警告的情况。
    • 所有 strict 都抱怨我没有为变量命名空间。
    【解决方案3】:

    对新脚本的调用是什么?如果使用 shell,您是否检查过您的环境变量?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多