考虑以下 perl 脚本 (read.pl
):
my $line = <STDIN>;
print "Perl read: $line";
print "And here's what cat gets: ", `cat -`;
如果从命令行执行此脚本,它将获取第一行输入,而cat
获取其他所有内容,直到输入结束(^D
被按下)。
但是,当输入从另一个进程通过管道传输或从文件读取时,情况会有所不同:
$ echo "foo\nbar" | ./read.pl
Perl read: foo
And here's what cat gets:
Perl 似乎在某处逐渐缓冲整个输入,并且使用反引号或系统调用的进程看不到任何输入。
问题是我想对混合的脚本进行单元测试<STDIN>
以及对其他进程的调用。最好的方法是什么?我可以关闭 perl 中的输入缓冲吗?或者我可以以“模仿”终端的方式假脱机数据吗?
这不是 Perl 问题。这是一个 UNIX/shell 问题。当您运行不带管道的命令时,您处于行缓冲模式,但是当您使用管道重定向时,您处于块缓冲模式。你可以通过以下方式看到这一点:
cat /usr/share/dict/words | ./read.pl | head
这个C程序也有同样的问题:
#include <stdio.h>
int main(int argc, char** argv) {
char line[4096];
FILE* cat;
fgets(line, 4096, stdin);
printf("C got: %s\ncat got:\n", line);
cat = popen("cat", "r");
while (fgets(line, 4096, cat)) {
printf("%s", line);
}
pclose(cat);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)