加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读