«Изменение значения только для чтения» в цикле while с неявной переменной $ _ - PullRequest
8 голосов
/ 12 октября 2011

Я не очень понимаю, почему следующий фрагмент кода Perl

#!/usr/bin/perl -w

use strict;
use warnings;

strange($_) for qw(a b c);

sub strange {
  open FILE, '<', 'some_file.txt' or die;
  while (<FILE>) { } # this is line 10
  close FILE;
}

выдает следующую ошибку

Modification of a read-only value attempted at ./bug.pl line 10.

Это ошибка?Или я должен кое-что знать об использовании магической / неявной переменной $_?

Ответы [ 2 ]

11 голосов
/ 12 октября 2011

Конструкция while (<fh>) неявно присваивается глобальной переменной $_.

Это описано в perlop:

Если и только если входной символ является единственным внутри условный оператор while (...), значение автоматически присваивается глобальной переменной $ _, уничтожая все, что там было ранее. (...) Переменная $ _ не является неявно локализованной. Вы будете должны поставить местный $ _; перед циклом, если вы хотите, чтобы это произошло.

Ошибка выдается, потому что $_ изначально имеет псевдоним для постоянного значения ("a").

Вы можете избежать этого, объявив лексическую переменную:

while (my $line = <FILE>) {
    # do something with $line
}
9 голосов
/ 12 октября 2011

Да, цикл while считывает $_, который в этот момент связан с константой (строка «a») Вы должны использовать local $_; перед циклом while или читать в отдельной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...