На этом шаге мы рассмотрим функции getc(), read() и length().
Кроме операции чтения записей файла <>, Perl предоставляет еще два способа чтения информации из файла: функции getc() и read(). Первая читает один байт из файла, тогда как вторая читает записи фиксированной длины.
Функция getc() возвращает символ в текущей позиции файла, дескриптор которого передан ей в качестве параметра, или неопределенное значение в случае достижения конца файла или возникновении ошибки. Если функция вызывается без параметра, то она читает символ из стандартного файла ввода STDIN.
getc; # Чтение символа из STDIN. getc F1; # Чтение символа в текущей позиции файла с дескриптором F1.
Функции read() передаются три или четыре параметра и ее синтаксис имеет вид:
read ДЕСКРИПТОР, ПЕРЕМЕННАЯ, ДЛИНА [,СМЕЩЕНИЕ];
Она читает количество байтов, определенное значением параметра ДЛИНА, в скалярную переменную, определяемую параметром ПЕРЕМЕННАЯ, из файла с дескриптором, заданным первым параметром ДЕСКРИПТОР. Возвращаемое значение - действительное количество прочитанных байтов, 0 - при попытке чтения в позиции конца файла и неопределенное значение в случае возникновения ошибки. Параметр СМЕЩЕНИЕ определяет количество сохраняемых байтов из содержимого переменной ПЕРЕМЕННАЯ, т.е. запись прочитанных из файла данных будет добавлена к содержимому переменной после байта, определяемого значением параметра СМЕЩЕНИЕ. Отрицательное, значение смещения -n (n - целое число) означает, что из содержимого переменной ПЕРЕМЕННАЯ отбрасываются последние n байтов и к оставшейся строке добавляется запись, прочитанная из файла. Следующий пример демонстрирует чтение записей фиксированной длины в предположении, что файл in.dat содержит три строки данных: One Two Three.
#! perl -w open(F1, "in.dat") or die "Ошибка открытия файла: $!"; $string = "1234567890"; read F1, $string, 6; # Чтение шести байт в переменную без смещения. print $string,"\n"; # $string = "One\nTw" read F1, $string, 6, length($string); print $string,"\n"; # $string = "One\nTwo\nThre"
Функция length() возвращает количество символов (байтов) в строковых данных, хранящихся в скалярной переменной, переданной ей в качестве параметра. После выполнения первой операции чтения содержимое переменной $string было уничтожено, так как эта функция read() вызывалась без смещения. Тогда как при втором чтении хранившиеся данные в переменной $string были полностью сохранены.
На следующем шаге мы рассмотрим организацию небуферизованного ввода/вывода.