有没有办法获取当前文件句柄,该句柄将与 perl 中的 <> 运算符一起使用?

Is there a way to get the current file handle that would be used with the <> operator in perl?

提问人:Adrian 提问时间:11/20/2022 更新时间:11/21/2022 访问量:67

问:

我已经看到可以关闭当前处理的文件,但似乎这实际上不是文件句柄,所以我不能在调用中使用它。有没有办法获取当前文件句柄,或者我是否必须自己显式打开文件?close ARGVARGVread

Perl 文件句柄

评论

1赞 TLP 11/21/2022
。但似乎 ARGV 实际上不是一个文件句柄——这是不正确的。如果您向我们展示了导致您得出此错误结论的代码,我们也许能够帮助您解决问题。虽然我不得不说,如果您使用从文件句柄读取,那么使用 ARGV 是一个糟糕的选择。 并使用 readline 和输入记录分隔符来确定缓冲区大小,而 read() 使用用户指定的大小。这是读取文件的两种不同方式read<><ARGV>

答:

5赞 Steffen Ullrich 11/20/2022 #1

...但似乎 ARGV 实际上不是文件句柄,所以我不能在读取调用中使用它

ARGV是一个文件句柄,它可以在 .read

引用 perlvar

...一个普通文件句柄,对应于最后一个打开的文件<>"*

所以它是一个文件句柄,可以在读取中使用。但是您需要先使用,以便实际打开文件。它不会像以前那样神奇地继续下一个文件。<><>

要简单地进行测试(UNIX shell 语法,您可能需要将其调整为 Windows):

perl -e '<>; read(ARGV, my $buf, 10); print $buf' file

将打开给定的文件并读取第一行。then 将从同一文件中读取接下来的 10 个字节。<>read

评论

0赞 Adrian 11/20/2022
哦,很高兴知道。什么是“...请注意,目前 ARGV 仅在 <> 运算符中具有神奇效果......是什么意思?如您可以使用代替?<ARGV><>
1赞 Steffen Ullrich 11/20/2022
@Adrian:是的,你也可以写代替.并且是唯一打开下一个文件并重新分配的魔力所在的地方。<ARGV><><>ARGV
0赞 ikegami 11/30/2022
回复“<>是唯一打开下一个文件并重新分配 ARGV 的魔力所在的地方。 是唯一的地方,虽然可以成为 .readline<...>readline
0赞 Steffen Ullrich 11/30/2022
@ikegami:我认为文档需要更新,因为它指出“请注意,目前”ARGV“仅在”<>“运算符中具有神奇的效果;在其他地方,它只是一个普通的文件句柄,对应于“<>”打开的最后一个文件。
1赞 ikegami 11/30/2022
显然是这样。“Perl 机器”中没有运算符,只有 Perl 语法。 编译为 或 。并且没有标志指示使用了语法。逻辑(仅)在“Perl 机器”的运算符中。无论您是通过使用还是无关紧要。<><...>globreadline<...>readline<...>readline
3赞 ikegami 11/21/2022 #2

<>是 的缩写。readline( ARGV )

使用的文件句柄是 。ARGV

但是,有特殊的代码可以打开/重新打开,但没有。readlineARGVread

但是,您可以通过操作 来实现使用 。readreadline$/

$ echo abcdef | perl -Mv5.14 -e'local $/ = \2; $_ = <>; say "<<$_>>";'
<<ab>>

$ perl -Mv5.14 -e'local $/ = \2; $_ = <>; say "<<$_>>";' <( echo abcdef )
<<ab>>