Perl:避免从stdin贪婪阅读?

前端之家收集整理的这篇文章主要介绍了Perl:避免从stdin贪婪阅读?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑以下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;
}

猜你在找的Perl相关文章