Perl:避免从stdin贪婪阅读?
发布时间:2020-12-16 06:22:05 所属栏目:大数据 来源:网络整理
导读:考虑以下perl脚本(read.pl): my $line = STDIN;print "Perl read: $line";print "And here's what cat gets: ",`cat -`; 如果从命令行执行此脚本,它将获得第一行输入,而cat获取其他所有内容,直到输入结束(按下^ D). 但是,当输入从另一个进程传送或从文件读
考虑以下perl脚本(read.pl):
my $line = <STDIN>; print "Perl read: $line"; print "And here's what cat gets: ",`cat -`; 如果从命令行执行此脚本,它将获得第一行输入,而cat获取其他所有内容,直到输入结束(按下^ D). 但是,当输入从另一个进程传送或从文件读取时,情况会有所不同: $echo "foonbar" | ./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: %sncat got:n",line); cat = popen("cat","r"); while (fgets(line,cat)) { printf("%s",line); } pclose(cat); return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |