Perl,禁用缓冲输入

有一个文件:
:~$cat fff
qwerty
asdf
qwerty
zxcvb

有一个脚本:

:~$cat 1.pl
#!/usr/bin/perl
print <STDIN>

该命令按预期工作:

:~$cat fff | perl -e 'system("./1.pl")'
qwerty
asdf
qwerty
zxcvb

但是这个命令不会按预期工作:第一个< STDIN>读取所有数据,而不是单行.如何禁用< STDIN>?的缓冲

:~$cat fff | perl -e '$_ = <STDIN>; system("./1.pl")'
:~$

解决方法

这里有两个Perl进程 – 第一个分配$_ =< STDIN>和调用系统,第二个打印< STDIN>

虽然第一个进程只将流的第一行读入$_,但在幕后Perl用缓冲区填充数据并将流留空

这样做的目的是什么?想到你要做的唯一方法是在第一个进程中将所有文件读入一个数组,然后删除第一行并将其余部分通过管道发送到第二个脚本

所有这一切似乎都是不必要的,如果您能描述潜在的问题,我相信有更好的方法

更新

既然你说你知道缓冲问题,那么执行此操作的方法是使用sysread,它将从较低级别的管道读取并避免缓冲

像这样的东西会起作用

cat fff | perl -e 'while (sysread(STDIN,$c,1)) {$_ .= $c; last if $c eq "\n"} system("./1.pl")'

但我不喜欢推荐它,因为你正在做的事情似乎非常错误,我希望你能解释你的真正目标

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...