gpt4 book ai didi

Perl:避免从标准输入中贪婪地阅读?

转载 作者:行者123 更新时间:2023-12-05 00:40:21 25 4
gpt4 key购买 nike

考虑以下 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;
}

关于Perl:避免从标准输入中贪婪地阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3698715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com