有一个文件:
:~$ cat fff
qwerty
asdf
qwerty
zxcvb
Run Code Online (Sandbox Code Playgroud)
有一个脚本:
:~$ cat 1.pl
#!/usr/bin/perl
print <STDIN>
Run Code Online (Sandbox Code Playgroud)
该命令按预期工作:
:~$ cat fff | perl -e 'system("./1.pl")'
qwerty
asdf
qwerty
zxcvb
Run Code Online (Sandbox Code Playgroud)
但是此命令将无法按预期工作:第一个<STDIN>读取所有数据,而不是单行.如何禁用<STDIN>的缓冲?
:~$ cat fff | perl -e '$_ = <STDIN>; system("./1.pl")'
:~$
Run Code Online (Sandbox Code Playgroud)
这里有两个Perl进程 - 第一个分配$_ = <STDIN>和调用system,第二个进行分配和调用print <STDIN>
虽然第$_一个进程只读取了流的第一行,但在幕后Perl已经用数据填充其缓冲区并将流留空
这样做的目的是什么?想到你要做的唯一方法就是在第一个进程中将所有文件读入一个数组,然后删除第一行并将其余部分通过管道发送到第二个脚本
所有这一切似乎都是不必要的,如果您能描述潜在的问题,我相信有更好的方法
更新
既然你说你知道缓冲问题,那么这样做的方法是使用sysread,它将从较低级别的管道读取并避免缓冲
这样的东西会起作用
cat fff | perl -e 'while (sysread(STDIN, $c, 1)) {$_ .= $c; last if $c eq "\n"} system("./1.pl")'
Run Code Online (Sandbox Code Playgroud)
但我不喜欢推荐它,因为你正在做的事情似乎非常错误,我希望你能解释你的真正目标