在我的PERL代码中,我需要使用Windows命令提示符执行一些操作,例如打开记事本,即
system("start notepad");
现在我发现perl在前一个语句完成之前不会移动到下一个语句。有没有办法在向系统发送命令后,perl移动到下一个语句而不检查系统任务是否结束。
我制作了一个示例代码来解释我的问题。我在这里完成了每项任务后显示的时间。
use Time::HiRes qw(time);
use POSIX qw(strftime);
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 1 executed at $date\n";
#######################printing time code ends###########
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 2 executed at $date\n";
#######################printing time code ends#####
system("start notepad");
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 3 executed at $date\n";
我的输出是:
Statement 1 executed at 20150101 19:09:37.614
Statement 2 executed at 20150101 19:09:37.614
Statement 3 executed at 20150101 19:09:37.647
显然,声明2和声明3之间存在很大差异,我想避免它。请提出建议。
注意:启动记事本只是一个例子,我可能想将100MB文件从1个文件夹复制到另一个文件夹,我不希望perl在向系统发送命令后等待。
答案 0 :(得分:8)
答案 1 :(得分:-2)
是什么让你认为它正在等待系统调用完成才能继续?
您所写的测试用例并没有给出明确的指示,告诉我们您的假设是正确的。您应该调整系统调用,以便执行更耗时的操作,例如执行完整C驱动器的目录列表。该测试将显示“语句2和语句3之间的巨大差异”是由于系统功能的启动成本和Windows 启动命令。
使用ysth建议的解决方案可以降低启动成本。
use strict;
use warnings;
use Time::HiRes qw(time);
use POSIX qw(strftime);
my ($t, $date);
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 1 executed at $date\n";
#######################printing time code ends###########
system('');
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 2 executed at $date\n";
#######################printing time code ends#####
system("start dir /s C:\\");
####################printing time code starts###########
$t = time;
$date = strftime "%Y%m%d %H:%M:%S", localtime $t;
$date .= sprintf ".%03d", ($t-int($t))*1000; # without rounding
print "Statement 3 executed at $date\n";
声明1于20150101 07:23:04.745执行 声明2于20150101 07:23:04.757执行 报表3于20150101 07:23:04.767执行
将附加参数添加到系统调用后,这是新的时间。
声明1于20150101 07:27:56.333执行 声明2于20150101 07:27:56.355执行 报表3执行于20150101 07:27:56.356