gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:31:43 26 4
gpt4 key购买 nike

我从 STDIN 读了几行。如何将 STDIN 的剩余部分传递给从标准输入读取的命令(例如 md5sumwc )?

我可以做一个:

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

但出于效率原因,我不想触摸输入,而是传递 STDIN 的文件句柄。有点像:
seq 10 | (read A; wc)

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

我从文件“foo”中读取了几行。如何将剩余的传递给从标准输入读取的命令(例如 md5sumwc )?

我可以做一个:
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 .

最佳答案

答案很简单:您不需要做任何特别的事情。您的 child 将自动继承您的STDINsystemexec .您没有从 STDIN 读取的所有内容都可以被 child 读取。

但是,有一个问题。因为一次读取一个字符会非常低效,所以 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);
...

未经测试。

关于Perl:将打开的文件句柄传递给读取 STDIN 的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206828/

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