Perl неявное закрытие сбрасывает $. переменная
Документация для Perl's close
говорится, что $.
не сбрасывается, если вы используете неявное закрытие, выполненное 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
не будет сбрасывать $.
?
Кстати, я использую Strawberry 5.16.1.
1 ответ
$.
на самом деле это не глобальная переменная, это атрибут самого последнего прочитанного дескриптора файла. И вы используете новый дескриптор файла в каждой итерации цикла.
Модифицируйте ваш код так, чтобы он "исправил" это:
my $fh;
for my $file (@files){
open $fh, '<', $file;