Perl-需要在上一行完成之前继续下一行

Perl-需要在上一行完成之前继续下一行,perl,line,next,Perl,Line,Next,我有一个执行批处理语句并开始下载流的小脚本。batch语句将继续,直到停止为止。我需要脚本继续到下一行,在那里它设置了正在创建的文件的位置,因为它只会在批处理的前一行代码完成时继续。这可能吗?代码如下: #!/usr/bin/perl use strict; use warnings; my $test_path= "http://xxx.xxx.x.x:8000/test/stream1.m3u8"; my $status = system("batch statment here");

我有一个执行批处理语句并开始下载流的小脚本。batch语句将继续,直到停止为止。我需要脚本继续到下一行,在那里它设置了正在创建的文件的位置,因为它只会在批处理的前一行代码完成时继续。这可能吗?代码如下:

#!/usr/bin/perl
use strict;
use warnings;

my $test_path= "http://xxx.xxx.x.x:8000/test/stream1.m3u8";
my $status = system("batch statment here");                
print "Location: $test_path\n\n" or die "can't do it:$!";

在类Unix系统上,可以在后台运行该命令

system("batch statment here &");
但是,您不会从batch命令获得返回状态,而是从shell获得返回状态。

在perlfaq8中列出了几个您可以使用的模块,但对于这个特定任务来说似乎是最简单的。它在Windows和*nix上都能工作,因此如果切换操作系统,就不必更改Perl代码,尽管您必须更改调用的外部命令。按如下方式运行:

use Proc::Background;

my $proc = Proc::Background->new($command, $arg1, $arg2)
        or die "Failed to run $command: $!";

# Do stuff

my $wait_status = $proc->wait;
my $exit_code = $wait_status >> 8;
print "$command finished with exit code $exit_code\n";
新方法的工作原理与内置系统命令非常相似。您可以传递一个参数列表,其中命令名后跟参数,就像我在上面所做的那样,不调用shell;或者传递一个包含命令及其参数的字符串来调用shell

在Windows上,您可以向可执行文件传递绝对路径或相对路径:

如果可执行文件的名称是绝对路径,则为new 检查给定位置是否存在可执行文件 否则就会失败。如果可执行文件的名称不是 绝对,然后使用路径搜索可执行文件 环境变量。输入的可执行文件名始终为 替换为此进程确定的绝对路径

此外,在搜索可执行文件时 使用未更改的可执行文件搜索可执行文件 名称,如果未找到该名称,则由 将“.exe”附加到名称,以防名称被传递 没有“.exe”后缀

请注意,如果要获取批处理命令的退出状态,在某些时候必须调用$proc->wait。如果进程仍在运行,您将不得不等待它完成惊喜,惊喜。但是,您可以将此步骤推迟到脚本结束,同时完成一些其他工作

如果需要终止进程,可以使用$proc->die,如果进程消失或已经停止,则返回1,否则返回0

您还可以将die_on_destroy选项设置为new,以便在销毁相应的Proc::Background对象时终止进程:

my $proc = Proc::Background->new({ die_upon_destroy => 1 }, $command, $arg1, $arg2);
$proc = undef;  # $command killed via die() method
请注意这是如何与词法范围一起工作的:

{
    my $proc = Proc::Background->new({ die_upon_destroy => 1 }, $command, $arg1, $arg2);
}
# Lexical variable $proc is now out of scope, so $command is killed
您还可以使用timeout_system来限制外部命令的运行时间,而不是使用新方法创建Proc::Background对象:


超时过期时,进程将被终止。

请参阅perlfaq8。Windows 7 ProfessionAlId您的意思是启动的进程将使用打印输出?进程将不会使用打印输出。该过程实时创建视频文件。启动批处理文件后,我需要执行下一行。对于剩余的Perl脚本,我不需要批处理文件中的任何返回值。只需要执行下一行,将用户视频播放器引导到批处理文件创建文件的路径。正如建议的那样,我尝试在后台运行它,但下一行仍然不执行。
my $wait_status = timeout_system($seconds, $command, $arg1, $arg2);
my $exit_code = $wait_status >> 8;