用perl CGI打印网页STDOUT逐步执行命令

时间:2015-04-10 17:58:19

标签: perl cgi

我在perl中有一个CGI脚本,它运行带有虚拟目标的swi-prolog:

它写了" 1"然后在第二次写入" 2"最后在一条新线上写道"结束"在新的一行

我的目标是获得一个网页,其中 1,2,3,end 将被写入逐渐,因为如果您执行此prolog代码,它将在终端中发生。< / p>

我的perl CGI:

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

print "Content-type: text/html\n\n";

print <<EOF;
<html>
<head><title>Title</title></head>
<body>
EOF

my $out = `swipl -g 'writeln(1), sleep(1), writeln(2), sleep(1), writeln(3), sleep(1),  writeln(end)' -t halt`;
print "<pre>$out</pre>";

print <<EOF;
</body>
</html>
EOF
exit;

1 个答案:

答案 0 :(得分:3)

Backticks不会按照你希望的方式工作。 Perl将产生子进程&amp;等待它完成(sleep语句&amp; all)。然后,它的输出将被分配到$out&amp;只有这样,你的脚本才会继续,一次打印单个字符串$out

相反,你应该使用管道:

open my $program_pipe, '-|', 'unbuffer', 'swipl', '-g', q{writeln(1), yada yada}
    or die 'Help me Rhonda';
local $| = 1; # we don't want the web server waiting on us as we wait on the kid.
while (my $line = <$program_pipe>) {
  print $line;
}

您可能希望确保您的子程序在每个sleep之前刷新输出,或者您将在不可预测的点处暂停,因为在程序休眠时任何缓冲的输出都将保持不写。 unbuffer为孩子创造了一个假tty,这个&#34;傻瓜&#34;大多数程序执行行缓冲而不是块缓冲。

对于一些最后的修饰,你可能希望用一些JavaScript完成文档1st,然后使用AJAX或web socket技术来提供额外的内容...