【发布时间】:2021-11-11 15:41:52
【问题描述】:
我正在尝试使用 Perl 来:
- 等到至少 1 个字节到达 STDIN
- 读取所有 STDIN 并将其保存为二进制文件(与 UTF-8 兼容)
我的尝试:
# read STDIN into a string/buffer and save it (maybe this only reads one line):
echo hello | perl -e 'open (fh, ">", "my_filename.txt"); print fh <STDIN>';
# or:
echo hello | perl -e 'open STDIN, ">", "my_filename.txt"'
# ideally be able to specify the filename:
echo hello | perl -e 'open STDIN, ">", $ARGV[0]' my_filename.txt
我不能通过 echo hello > my_filename.txt 使用 shell 来执行此操作,因为 shell 有一个古老的错误/功能,其中所有文件句柄都是同时打开的,而不是基于某些依赖逻辑顺序打开的。所以我的计划是等到有字节在 STDIN 上等待,然后再打开目标文件。
不幸的是,我时间紧迫,没有时间重新学习 Perl 的语法。我认为我出错的地方是我试图在这里将 STDIN 称为一个新变量,而不是实际的输入流。我查看了其他各种缓冲解决方案,但不幸的是它们在某些方面都不够用(实际上不工作,不是跨平台的,需要安装额外的可执行文件等)。
如果您直接执行重定向或通过在块上循环以减少内存使用量,则会获得奖励积分。知道如何从文件中读取和写入 STDOUT 也会有所帮助。这在 awk 之类的东西中也可能是可能的,但请注意,我正在避免使用 sed,因为 GNU sed 和 BSD sed 之间的另一种古老的语法选择很差,这通常会阻止在两个平台上使用单个命令而不进行调整。所以 Perl 似乎是要走的路。
【问题讨论】:
标签: file perl pipe buffer stdin