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

Perl:将打开的文件句柄传递给读取STDIN的程序

发布时间:2020-12-15 21:43:18 所属栏目:大数据 来源:网络整理
导读:我从STDIN读了几行.如何将剩余的STDIN传递给从标准输入读取的命令(例如md5sum或wc)? 我可以做一个: read_a_few_lines_from_diamond_operator();open (C,"|cmd");while() { print C }close C;cleanup_after_C(); 但出于效率原因,我不想触摸输入,而是传递STD
我从STDIN读了几行.如何将剩余的STDIN传递给从标准输入读取的命令(例如md5sum或wc)?

我可以做一个:

read_a_few_lines_from_diamond_operator();
open (C,"|cmd");
while(<>) { print C }
close C;
cleanup_after_C();

但出于效率原因,我不想触摸输入,而是传递STDIN的文件句柄.有点像:

seq 10 | (read A; wc)

在将其余部分传递给wc之前,read读取尽可能多的内容.我不能使用这个解决方案,因为我需要从我的perl程序内部启动命令,我需要在cmd完成后完成工作.

我从’foo’文件中读了几行.如何将剩余部分传递给从标准输入读取的命令(例如md5sum或wc)?

我可以做一个:

open (F,"<foo");
read_a_few_lines_from_F();
open (C,"|cmd");
while(<F>) { print C }
close C;
cleanup_after_C();

但出于效率原因,而是传递文件’foo’的其余部分.

我有一种感觉,可以使用像select,open(FOO,“>& STDOUT),exec 6<& 0,fork,pipe这样的技巧来完成.

解决方法

答案很简单:你不需要做任何特别的事情.您的孩子将使用system和exec自动继承您的STDIN.您从STDIN读取的所有内容都将由孩子阅读.

但是有一个问题.因为一次读取一个字符会非常低效,Perl会一次从文件中读取一个块.也就是说,您从文件中读取的内容比从Perl返回的“少行”中读取的内容更多.使用以下命令可以清楚地看到这一点:

perl -E'say $_ x 500 for "a".."z"' 
   | perl -e'<>; <>; exec("cat");' 
   | less

cat不是从第二行的开头开始,而是从“q”的中间开始(在字节8192处)!

如果您希望这样做,您必须从readline(<>)的读取行切换到使用sysread读取单个字节.

关注更大的图景,我认为有一个解决方案:

open(STDIN,"<","foo") or die $!;
read_a_few_lines(*STDIN);
my $pos = tell(STDIN);
open(STDIN,"foo") or die $!;
sysseek(STDIN,$pos,SEEK_SET);
system(@cmd);
...

或者甚至可能:

open(STDIN,"foo") or die $!;
read_a_few_lines(*STDIN);
sysseek(STDIN,tell(STDIN),SEEK_SET);
system(@cmd);
...

未经测试.

(编辑:李大同)

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

    推荐文章
      热点阅读