perl - 本地在标准流/裸字文件句柄 : STDIN? 上做什么

标签 perl scope stdin filehandle

我正在考虑做

open(*STDIN, "<", "/dev/null" );
open(my $fh, "-|", "/bin/bash", "/tmp/foo");
print for <$fh>;'
但是,我想*STDIN恢复,后来,所以我尝试了。
{
  open(local *STDIN, "<", "/dev/null" );
  open(my $fh, "-|", "/bin/bash", "/tmp/foo");
  print for <$fh>;
}
你可以用 cat 试试这个带和不带 local像这样的关键字,
{
  # remove local and it works,
  open(local *STDIN, "<", "/dev/null" );
  open(my $fh, "-|", "/bin/cat");
  print for <$fh>;
}
只有没有 localcat阅读自 /dev/null .那么local有什么用实际上是在一个裸字文件句柄上做的吗?

最佳答案

open ...,'-|'system从标准输入读取的调用将尝试从文件描述符 0 读取。如果你不搞砸,外部程序将从与 perl 的标准输入相同的输入流中读取。

# reads from standard input
open my $fh, '-|', "/bin/cat";
while (<fh>) { print }

# reads from /tmp/foo
open STDIN, "<", "/tmp/foo";       # replaces fd0 with handle to /tmp/foo
open my $fh, '-|', "/bin/cat";
while (<$fh>) { print }

# reads from standard input
open local *STDIN, "<", "/tmp/foo";  # doesn't close fd0, creates new fd
open my $fh, '-|',  "/bin/cat";
while (<$fh>) { print }

# reads from /tmp/foo
close STDIN;
open FOO, "<", "/tmp/foo";       # fileno(FOO) should be 0 now
open my $fh, '-|', "/bin/cat";
while (<$fh>) { print }

关于perl - 本地在标准流/裸字文件句柄 : STDIN? 上做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63710382/

相关文章:

java - DBD::Oracle 如何在连接前设置 v$session.program

perl - Perl 中的数组初始化

c - 在 C 函数中声明的函数可以在全局范围内使用吗?

go - 从 stdin 读取到 int 的字符串的类型转换给我一个 0

perl - 为什么 Perl 压缩我的数组?

c++ - 为什么对象在作为指针传递时超出范围,但在返回时却不会超出范围

gcc - 如何在不扩展内联汇编的情况下在GCC内联汇编中声明和初始化局部变量?

C scanf() 扫描集从控制台读取逗号分隔值(字符串和整数)

c - fflush(stdin) 函数不起作用

perl - Perl中赋值运算符的结果列表评估不一致?