Система STDIN, STDOUT и STDERR. , открывающей поток обмена данными с указанным файлом. Требования надежности рекомендуют обязательно проверять все FILE_HANDLE:
# открыть для чтения файл по имени, взятом из $file_name
open(FILE_HANDLE, $file_name)
# или аварийно завершить программу с выдачей сообщения
or die("Ошибка открытия файла $file_name: $!\n"); #
В случае успешного помещает в свой первый
open my $file_handle, $file_name or die "Ошибка открытия файла $file_name: $!\n";
(Как и при вызове других функций в
При открытии
| Обозначение | Режим открытия | Пример использования |
|---|---|---|
| < | Чтение (существующего |
|
| > | Перезапись (с начала |
|
| >> | Дозапись (в |
|
| +< | Чтение и |
|
| +> | ||
| +>> | Дозапись и чтение |
Применяются две : старая с двумя
open $fh, '</temp/buffer.txt'; open $fh, '<', '/temp/buffer.txt';
Программисты, знающие язык C, могут воспользоваться для открытия потоков функцией sysopen(), которая аналогична функции открытия потоков в C, и к тому же позволяет более тонко настраивать режимы открытия , который можно прочитать
perldoc perlopentut
, закрывающей поток
close(FILE) or die("Ошибка при закрытии файла: $!\n");
close $handle or die "Ошибка закрытия файла: $!\n";
В новой многоуровневой
open my $in, "<:encoding(UTF-8)", 'utf8.txt' or die;
open my $out, ">:encoding(cp1251)", 'cp1251 .txt' or die;
while(<$in>){ print $out $_; }
close $in or die;
close $out or die;
В некоторых операционных системах (например, в binmode($file_handle). При работе в операционных системах, не требующих установки этого режима, binmode() не оказывает никакого действия.
В огромном числе случаев ввод данных в $/ ($INPUT_RECORD_SEPARATOR). Для чтения одной строки из входного потока используется операция "кристалл" (
$input = <>; # чтение строки в $input из STDIN $line = <FILE>; # чтение строки в $line из потока FILE $in = <$handle>; # чтение строки в $in из потока $handle
Операция чтения "кристалл" в скалярном undef, которое воспринимается как ложное. Поэтому типичный цикл построчного
open my $fh, "< $file" or die "Ошибка открытия: $!";
while (my $line = <$fh>) { # чтение строки в переменную $line
chomp $line; # удаление разделителя строк
print length $line, " $line\n"; # обработка строки
}
close $fh or die "Ошибка закрытия: $!";
Операция чтения "кристалл" в списочном
@lines= sort(<$fh>); # в @lines отсортированные строки из $fh
Построчный вывод данных выполняет функция , которая по умолчанию выводит STDOUT. Если требуется направить информацию в другой поток, то перед списком выводимых данных указывается
print($list, $of, $output, $values); # вывод в STDOUT print STDOUT $list, $of, $output, $values; # вывод в STDOUT print(STDERR $list, $of, $output, $values); # вывод в STDERR print FILE $list, $of, $output, $values; # вывод в FILE print($file $list, $of, $output, $values); # вывод в $file
Для printf(), которая преобразует sprintf(). Например, так можно вывести отформатированное текущее время в разные выходные потоки:
my ($hh, $mm, $ss) = (localtime)[2, 1, 0]; # выбрать из списка нужные значения: часы, минуты, секунды my $format = "%02d:%02d:%02d\n"; # формат вывода printf $format, $hh, $mm, $ss; # вывод в STDOUT printf(STDERR $format, $hh, $mm, $ss); # вывод в STDERR printf $file $format, $hh, $mm, $ss; # вывод в $file
Задавая различные форматы преобразования, можно выводить данные в требуемом представлении или в виде колонок указанной ширины. Более тонкое управление выводимыми данными организуется средствами
В __END__ (в __DATA__ (в программном модуле). При выполнении программы данные из этого встроенного
while (my $line = <DATA>) { # читаем построчно данные
print $line; # обрабатываем данные
}
__END__
Это данные из встроенного файла
Двоичные данные обычно хранятся в файлах без нужно установить режим обработки двоичных данных с помощью функции binmode().
open(my $fh, ">$file") or die("Ошибка открытия: $!");
binmode($fh);
. Также имеется функция небуферизованного вывода syswrite(), которой при вызове указываются три syswrite возвращает undef ), что можно использовать для проверки успешности записи. Это делается так:
syswrite($fh, $record, length($record)) == length($record)
or die("Ошибка записи: $!");
, которая упаковывает в скалярную переменную и приводится в таблице 9.2. За каждым символом в шаблоне может следовать десятичное число, которое рассматривается как ширина преобразуемого поля. Поля в шаблоне могут разделяться пробелами для удобства чтения.
| Шаблон | Мнемоника | Описание преобразования |
|---|---|---|
| a | произвольная последовательность |
|
| A | ||
| b / B | строка |
|
| c / C | однобайтовые символы со знаком / без знака | |
| f / d | число с плавающей точкой одинарной / двойной точности | |
| F | число с плавающей точкой одинарной точности во внутреннем представлении (NV) | |
| D | длинное число с плавающей точкой двойной точности | |
| h / H | шестнадцатеричная строка с младшим / старшим полубайтом ( |
|
| i / I | целое (>=32 |
|
| j / J | целое во внутреннем представлении со знаком (IV) / без знака (UV) | |
| l / L | длинное (32 |
|
| n / N | беззнаковое короткое (16 |
|
| p / P | ||
| q / Q | сверхдлинное (64 |
|
| s / S | короткое (16 |
|
| u | строка, |
|
| U | ||
| v / V | беззнаковое короткое (16 |
|
| w | целое, сжатое в соответствии с |
|
| x | вставка \0 ( |
|
| X | пропуск |
|
| Z | ASCIIZ | строка ASCIIZ (оканчивающаяся \0), дополненная \0 |
| @ | заполнение \0 до указанной |
Например, целочисленное значение, возвращаемое функцией , и дробное значение, возвращаемое функцией , можно упаковать в переменную $ с помощью шаблона 'l1 d1', который означает: "одно длинное
$record = pack 'l1 d1', time(), rand(); #
Вот еще несколько несложных примеров использования разных шаблонов для функции :
$bin = pack('a5', 'Yes'); # в $bin будет: 'Yes\0\0'
$bin = pack('A5', 'Yes'); # в $bin будет: 'Yes '
$bin = pack('a4', 'abcd','x','y','z'); # в $bin: 'abcd'
$bin = pack('aaaa', 'abcd','x','y','z'); # в $bin: 'axyz'
$bin = pack('C2', 65,66,67); # в $bin будет: 'AB'
$bin = pack('U2', 0x263A, 0x263B); # в $bin будет: '??'
$bin = pack ('cxxc', 65,66); # в $bin будет: 'A\0\0B'
Для , которая распаковывает из скалярной переменной в
@list_of_values = unpack($template, $binary_record);
Кроме того, с помощью функции можно из строки извлекать
# Поля данных в записи файла:
# c 1 по 7 байт - номер телефона
# с 8 длиной 30 - фамилия, имя, отчество абонента
# с 38 длиной 25 - адрес
# 1234567Бендер Остап Ибрагимович РСФСР, Черноморск
($phone, $name, $address)= unpack('A7A30A25', $record);
Чтобы пропустить ненужные поля, достаточно указать в шаблоне пропуск определенного количества
($name, $address)= unpack('x7A30A25', $record);
Подробное описание шаблонов и работы функций и можно найти в стандартной документации с помощью все той же
perldoc perlpacktut
Для чтения двоичных данных или текстовых данных фиксированной длины применяется функция , которой в качестве
until(eof($fh)) { # читать до достижения конца файла
# считать очередной блок данных и проверить его длину
read($fh, $record, $record_size) == $record_size
or die('Неправильная длина данных');
# распаковать данные по шаблону из $record в @data
@data = unpack($template, $record);
# обработать введенные данные...
}
При работе с данными фиксированной длины обычной практикой является считывание или , которой передается три
seek($handle, 64, 0); # переместиться на 64 байта от начала seek($handle, 25, 1); # сместиться на 25 байт вперед seek($handle, -10, 2); # установиться на 10 байт до конца seek($handle, 0, 0); # установить позицию в начало файла
С помощью функции tell(), которая возвращает смещение относительно начала
$pos = tell($handle); # запомнить текущую позицию в $pos seek($handle, $pos-5, 0); # сместиться на 5 байт назад
В следующем примере увеличивается поле $new_pos:
seek($file, $new_pos, 0); # установить позицию чтения $pos = tell($file); # и запомнить ее в переменной read($file, $number, 2); # прочитать 2-байтовое поле seek($file, $pos, 0); # установить в исходную позицию syswrite($file, ++$number, 2); # записать новое значение
Перед выполнением
| Операции | Описание проверок |
|---|---|
| -r -w -x | |
| -R -W -X | |
| -o -O | |
| -e -z | |
| -s | |
| -f -d | |
| -l -S -p | |
| -b -c | |
| -u -g -k | Для |
| -t | Файловый |
| -T -B | |
| -M -A -C | Время изменения ( |
Вот несколько типичных примеров использования операций проверки
open($f1, "<$file1") # открыть файл на чтение,
if (-e $file1) # если он существует и
(-r $file1); # он доступен на чтение
open $f2, ">$file2" # открыть файл на запись,
if -w $file2; # если в него можно писать
$file_size = -s $file; # узнать размер файла
print "$file - является каталогом!" if -d $file;
В
Функция переименовывает
$ok = rename("$path/$old_name", "$path/$new_name");
Функция unlink() удаляет
unlink($list, $of, $files); # удалить список файлов unlink $file if -e $file; # удалить файл, если он существует
Функция усекает undef - при возникновении ошибки.
$ok = truncate($file, $size);
Функция stat() возвращает информацию о
@info = stat($file); # получить всю информацию о файле $size = $info[7]; # размер файла в байтах $modified = localtime($info[9]); # время изменения файла
Подробное описание всех элементов информационного списка можно найти в документации, указав утилите чтения документов
perldoc -f stat
Функция utime() изменяет у
utime($access_time, $modified_time, @list_of_files);
Кроме упомянутых, есть еще встроенные функции для изменения прав доступа и владельца
Помимо работы с
Функция mkdir() создает каталог с указанным именем. Вторым $!, которая содержит сообщение об ошибке.
$ok = mkdir $directory_name; # создать каталог mkdir $dir, $access_rights; # создать каталог, задав права
Функция rmdir() удаляет каталог по его имени, если он пуст, возвращает число 1 при успешном удалении каталога или 0 в случае ошибки. Тогда из переменной $! можно выяснить подробности неудачи:
$ok = rmdir $directory_name; # удалить каталог
Функция chdir() изменяет $ENV{"HOME"} или $ENV{"LOGNAME"} из специального хэша %ENV, который содержит значения
$ok = chdir $new_dir; # перейти в каталог $new_dir chdir; # перейти в домашний каталог
Много других возможностей по работе с каталогами предоставляют функции из cwd() из Cwd возвращает имя текущего (рабочего) каталога во время выполнения программы:
use Cwd; # подключить библиотечный модуль Cwd my $current_work_directory = cwd; # запросить текущий каталог
Иногда при выполнении программы нужно определить каталог, откуда она была запущена, чтобы организовать доступ к его , устанавливаемая в модуле FindBin из
use FindBin; # подключить библиотечный модуль FindBin my $program_start_dir = $FindBin::Bin; # стартовый каталог
Перед чтением содержимого каталога его необходимо открыть. Функция opendir() открывает каталог по его имени и ассоциирует его с указанным манипулятором каталога. Функция возвращает число 1 при успешном открытии, undef - при неудаче. Вот так, например, открывается каталог и создается
$ok = opendir DIR_HANDLE, $directory_name;
Современный стиль
$ok = opendir my $dir_handle, $directory_name;
Функция closedir() закрывает каталог, открытый функцией opendir(), используя undef - при неудаче. Хотя открытые каталоги автоматически закрываются по окончании программы, рекомендуется все же делать это явно:
$ok = closedir $dir_handle; # закрыть каталог
Функция readdir() в скалярном undef, когда будет прочитан последний элемент. Например:
my $file_name = readdir $dir_handle;
Таким образом можно организовать обработку всех элементов каталога в цикле, исключая текущий и
while (my $file_name = readdir $dir_handle) {
if ($file_name ne '.' $file_name ne '..') {
print "каталог $file_name\n" if -d $file_name;
print "файл $file_name\n" if -f $file_name;
}
}
В списочном readdir() возвращает
@file_names = readdir $dir_handle; # считать весь каталог
Иногда требуется, не закрывая каталога, начать его обработку сначала. Функция rewinddir() устанавливает
rewinddir $dir_handle; # 'перемотать' на начало каталога
Функция telldir() возвращает текущую seekdir():
$dir_position = telldir $dir_handle; # позиция чтения
Используя возвращенное функцией telldir() значение, seekdir() устанавливает новую readdir():
seekdir $dir_handle, $dir_position; # вернуться к позиции
После изучения представленных в этой лекции средств
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.