2015-06-06 8 views
0

Новое на perl (и язык вообще), и зашли так далеко, как OPEN FH. Немного путают следующие два сценария (выходы разные, но я не мог понять, почему второй «ошибочный»).непонимание файлового дескриптора (или массива?) В perl?

Сценарий 1

#! usr/bin/perl 
use warnings; 
use strict; 
open FILE, "example.txt" or die $!; 
while (<FILE>) { 
    print $_; 
    } 

Скрипт2

#! usr/bin/perl 
use warnings; 
use strict; 
open FILE, "example.txt" or die $!; 
my @array = <FILE>; 
while (<FILE>) { 
    print $_; 
    } 

example.txt содержит 3 строки предложения. Когда я назначаю filehandle FILE массиву, вдруг $_ станет пустым ??

Если я заменить <FILE> в while цикле с массивом (@array), цикл не может остановиться и $_ становится «неинициализированным значение».

Это, пожалуй, очень основное недоразумение filehandle и массив, но кто-то может помочь объяснить их - на простом английском языке -? Или укажите на ссылки, где я мог бы найти больше информации (несколько ссылок можно найти и проконсультировались с ними, но, очевидно, я все еще не мог понять, почему сценарии 2 (и 3) неверны). Большое спасибо.

+2

http://perlmaven.com/reading-from-a-file-in-scalar-and-list-context –

+0

Большое спасибо за показ perlmaven !! –

+0

Похоже, Сухой27 решил вашу проблему, но хочу отметить, что в Perl это распространенная идиома, использующая три-arg open: open my $ fh, '<', 'file.txt' или die "Can 't открыть файл: $! "; – stevieb

ответ

2

В Perl, когда вы читаете из дескриптора файла в контексте списка, он автоматически читает в конце файла. $_ пуст, потому что весь файл был прочитан в @array, а файл-дескриптор перенесен в EOF. Разнообразная обработка Perl одной и той же команды в скалярном и контекстном списке необычна, но поведение самого дескриптора файла довольно стандартно для разных языков. В общем случае дескриптор файла или входной поток позволят вам читать строку за раз, побайтовый за один раз или весь файл за раз, и иметь указатель, который отслеживает последнее место в прочитанном файле. Когда вы случайно переместили этот указатель до конца файла (EOF), выполнив чтение в контексте списка, ваш следующий вызов для чтения строки обнаруживает, что больше нет файла для чтения. Это довольно хорошее объяснение scalar and list context; это может быть более сложная часть того, что здесь происходит.

 Смежные вопросы

  • Нет связанных вопросов^_^