【问题标题】:Perl implicit close resets the $. variablePerl 隐式关闭重置 $.多变的
【发布时间】:2013-01-08 22:12:21
【问题描述】:

Perl 的closedocumentation 声明如果您使用open 完成的隐式关闭,$. 不会重置。我试图确切地了解这意味着什么,但无法实现。这是我的脚本:

use strict;
use warnings;
use autodie;
my @files = qw(test1.txt test2.txt test3.txt);

#try with implicit close
for my $file (@files){
    open my $fh, '<', $file;
    while(<$fh>){
        chomp;
        print "line $. is $_\n";
    }
    #implicit close here
}

以下是读入的所有三个文件的内容:

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

由于我没有显式调用close,因此应该使用隐式close(我认为)并且不应该重置$.。但是,当我运行脚本时,我得到了这个输出,显示 $.被重置:

line 1 is line 1
line 2 is line 2
line 3 is line 3
line 4 is line 4
line 5 is line 5
line 6 is line 6
line 7 is line 7
line 8 is line 8
line 9 is line 9
line 10 is line 10
line 1 is line 1
line 2 is line 2
line 3 is line 3
line 4 is line 4
line 5 is line 5
line 6 is line 6
line 7 is line 7
line 8 is line 8
line 9 is line 9
line 10 is line 10
line 1 is line 1
line 2 is line 2
line 3 is line 3
line 4 is line 4
line 5 is line 5
line 6 is line 6
line 7 is line 7
line 8 is line 8
line 9 is line 9
line 10 is line 10

它确实看起来像是被我重置了。我对文档的理解是错误的吗?有人可以告诉我在什么情况下隐式close 不会重置$.

顺便说一句,我使用的是草莓 5.16.1。

【问题讨论】:

  • 发布软件显然会删除尾随的. 字符,因此您的标题看起来像“Perl 隐式关闭重置$”。我通过用反引号包围 $. 来“修复”它(在标题中没有解释,但是哦)。

标签: perl file-handling special-variables


【解决方案1】:

$. 实际上不是全局变量,它是最近读取的文件句柄的属性。而且您在循环的每次迭代中都使用了一个新的文件句柄。

像这样修改你的代码“修复”它:

my $fh;
for my $file (@files){
    open $fh, '<', $file;

【讨论】:

  • 当我在外循环末尾添加undef $fh 时,它再次“中断”。谢谢!
  • Perl 的小细节总是让我惊叹不已。 +1。
  • 这主要作用在ARGV 文件句柄上——当你使用&lt;&gt; 读取并且你正在读取的文件到达EOF 时,perl 将重新打开@987654326 @ 到@ARGV 中的下一个文件,没有干预close,所以$. 将继续计数。 perldoc -f eof 中的close ARGV if eof 示例将捕获此条件并在每个文件之间放置一个close,以便$. 引用当前文件中的行位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多