На этом шаге мы рассмотрим чтение информации из файла.
Чтение информации из файла осуществляется операцией <>, операндом которой является дескриптор файла. В скалярном контексте при первом выполнении эта операция читает первую запись файла, устанавливая специальную переменную $., отслеживающую количество прочитанных записей, равной 1. Последующие обращения к операции чтения из файла с тем же дескриптором приводят к последовательному чтению следующих записей. В списковом контексте эта операция читает все оставшиеся записи файла и возвращает список, элементами которого являются записи файла. Разделитель записей хранится в специальной переменной $/, и по умолчанию им является символ новой строки "\n". Perl позволяет задать и другой разделитель записей обычной операцией присваивания переменной $/ нового символа разделителя записей. В следующем примере демонстрируются некоторые приемы чтения из файла.
#! perl -w open(F1, "in.dat") or die "Ошибка открытия файла: $!"; open(F2, "out.dat") or die "Ошибка открытия файла: $!"; $line1 = <F1>; # Первая запись файла in.dat. print "$line1"; $line2 = <F1>; # Вторая запись файла in.dat. print "$line2"; @rest = <F1>; # Оставшиеся записи файла in.dat. for($i=0; $i<=$#rest; $i++) { print "$rest[$i]"; } $/=":"; # Задание другого разделителя записей файла. @f2 = <F2>; print "\n"; # Печать прочитанных записей файла out.dat. for($i=0; $i<=$#f2; $i++) { print "$f2[$i]\n"; } $/ = "\n"; # Восстановление умалчиваемого разделителя записей. close(F1) or die $!; close(F2) or die $!; open(F3, "out.dat") or die "Ошибка открытия файла: $!"; print <F3>; # Печать всего файла. close(F3) or die $!;
Несколько комментариев к программе приведенного примера. В переменные $line1 и $line2 читаются соответственно первая и вторая строка файла in.dat, так как используется умалчиваемый разделитель записей "\n". Элементы массива @rest хранят строки с третьей по последнюю этого же файла: в операторе присваивания операция чтения <F1> выполняется в списковом контексте.
Перед чтением записей файла out.dat устанавливается новый разделитель записей - символ ":". Если файл out.dat, например, содержит только одну строку
111: 222: 333: Конец
то элементы массива @f2 будут содержать следующие значения:
$f2[0] = "111:" $f2[l] = "222:" $f2[2] = "333:" $f2[3] = "Конец"
При достижении конца файла операция <> возвращает неопределенное значение, которое трактуется как Ложь. Это обстоятельство обычно используется для организации чтения записей файла в цикле:
while($line = <F1>) { print $line; # Печать очередной строки связанного # с дескриптором F1 файла. }
На следующем шаге мы рассмотрим запись в файл.