Perl,禁用缓冲输入
发布时间:2020-12-15 21:15:28 所属栏目:大数据 来源:网络整理
导读:有一个文件: :~$cat fffqwertyasdfqwertyzxcvb 有一个脚本: :~$cat 1.pl#!/usr/bin/perlprint STDIN 该命令按预期工作: :~$cat fff | perl -e 'system("./1.pl")'qwertyasdfqwertyzxcvb 但是这个命令不会按预期工作:第一个 STDIN读取所有数据,而不是单行
有一个文件:
:~$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用缓冲区填充数据并将流留空 这样做的目的是什么?想到你要做的唯一方法是在第一个进程中将所有文件读入一个数组,然后删除第一行并将其余部分通过管道发送到第二个脚本 所有这一切似乎都是不必要的,如果您能描述潜在的问题,我相信有更好的方法 更新 既然你说你知道缓冲问题,那么执行此操作的方法是使用 像这样的东西会起作用 cat fff | perl -e 'while (sysread(STDIN,$c,1)) {$_ .= $c; last if $c eq "n"} system("./1.pl")' 但我不喜欢推荐它,因为你正在做的事情似乎非常错误,我希望你能解释你的真正目标 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |