提问人:Adrian 提问时间:11/20/2022 更新时间:11/21/2022 访问量:67
有没有办法获取当前文件句柄,该句柄将与 perl 中的 <> 运算符一起使用?
Is there a way to get the current file handle that would be used with the <> operator in perl?
问:
我已经看到可以关闭当前处理的文件,但似乎这实际上不是文件句柄,所以我不能在调用中使用它。有没有办法获取当前文件句柄,或者我是否必须自己显式打开文件?close ARGV
ARGV
read
答:
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 机器”的运算符中。无论您是通过使用还是无关紧要。<>
<...>
glob
readline
<...>
readline
<...>
readline
3赞
ikegami
11/21/2022
#2
<>
是 的缩写。readline( ARGV )
使用的文件句柄是 。ARGV
但是,有特殊的代码可以打开/重新打开,但没有。readline
ARGV
read
但是,您可以通过操作 来实现使用 。read
readline
$/
$ echo abcdef | perl -Mv5.14 -e'local $/ = \2; $_ = <>; say "<<$_>>";'
<<ab>>
$ perl -Mv5.14 -e'local $/ = \2; $_ = <>; say "<<$_>>";' <( echo abcdef )
<<ab>>
下一个:计算元素在文本文件中的位置
评论
read
<>
<ARGV>