考虑以下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,cat)) { printf("%s",line); } pclose(cat); return 0; }