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;
Другие вопросы по тегам