Perl имя файла без расширения
Если вы пропустили предыдущие три части, я бы советовал начать чтение с начала . В принципе, эту серию уроков можно читать в произвольном порядке и во всем разобраться, но зачем усложнять себе жизнь?
В отличие от предыдущих уроков, которые можно было читать практически без подготовки, сегодня от вас потребуется понимание того, что такое стандартные потоки ввода и вывода, файловый дескриптор, права доступа к файлам и тп. К сожалению, эти вопросы выходят за рамки статьи, так что вам предстоит разобраться в них самостоятельно. К счастью, с этим вам поможет практически любая книжка по основам ОС семейства UNIX. Да и в сети соответствующих статей должно быть в изобилии.
Ввод и вывод
Как всегда, давайте начнем с примера:
Функция chomp проверяет, находится ли в конце строки-аргумента символ новой строки (\n) и если он присутствует, отсекает его. Если такого символа нет, строка остается без изменений.
print STDOUT "Вывод строки в стандартный поток вывода \n " ;print STDERR "Вывод строки в стандартный поток ошибок \n " ;
Только что мы рассмотрели открытие файла на чтение. Чтобы открыть файл на запись, нужно перед его именем указать > или >>:
В заключение к этому разделу хотелось бы рассказать об интересной особенности оператора <>. Дело в том, что он может использоваться без указания файлового дескриптора:
В этом случае, если скрипт был вызван без аргументов, оператор будет производить чтение из STDIN. В противном случае все аргументы будут рассматриваться, как имена файлов. Чтение будет производиться по очереди из каждого файла. Можно сказать, что этот скрипт представляет собой аналог утилиты cat.
Работа с каталогами
Тут все настолько просто, что даже комментировать не хочется. Давайте лучше сразу перейдем к более интересному примеру:
Существует и более короткая запись:
А еще можно так:
Использовать функцию glob лучше в тех случаях, когда в выражение нужно подставить переменную.
Другие операции над файлами и каталогами
Также в Perl имеется несколько довольно полезных операторов:
Заключение
Дополнение. См также заметки, посвященные регулярным выражениям, объектно-ориентированному программированию в Perl и заливке модулей на CPAN. Можете считать их дополнениями к этой серии уроков.
Я только начал читать O'Reilly Learning Perl, 6th Edition, и был удивлен, когда наткнулся на этот отрывок.
Давайте представим, что вы ввели это в свой текстовый редактор. (Пока не беспокойтесь о том, что значат эти части и как они работают. О них вы узнаете чуть позже.) Как правило, эту программу можно сохранить под любым именем. Perl не требует никакого специального вида имени файла или расширения, и лучше вообще не использовать расширение.
Почему лучше не иметь расширения? Представьте, что вы написали программу для подсчета очков в боулинге и сказали всем своим друзьям, что она называется bowling.plx. Однажды вы решили переписать его на C. Вы все еще называете его тем же именем, подразумевая, что он все еще написан на Perl? Или вы всем говорите, что у него новое имя? (И не называйте это bowling.c, пожалуйста!) Ответ в том, что это не их дело, на каком языке они написаны, если они просто используют его. Так что, во-первых, его просто нужно было назвать боулингом.
Это единственный источник, который я видел в этом представлении, все остальное, что я прочитал, поддерживает расширение .pl. Я еще не программист на Perl, и я хотел узнать мнение сообщества по этому поводу, прежде чем я приобрел привычку.
Как объясняют ответы, расширение не важно. Для сценариев (включая Perl) важна строка shebang . Нет, сэр, не согласен. Без расширения файла как редакторы IDE и программисты выбирают подсветку синтаксиса? @GrandmasterB, глядя на линию Шебанга или читая модели. Я бы никогда не использовал .pl расширение для программ, которые я хотел бы распространять (эта информация - шум, а не сигнал), но это полезное напоминание для локальных сценариев. В любом случае, это обсуждение не имеет значения для> 90% кода Perl, поскольку оно либо в модуле ( .pm требуется расширение), либо в тесте ( .t расширение обычно). Где - то там , я думал , что мы уже отмечали , что .pl расширение было для р Эрл л ibraries, и каким - то образом превратился в то , что раньше люди для программ.Для сценариев Perl, предназначенных для переносимости, .pl требуемый Windows суффикс может «просочиться» в UNIX-подобные системы. Вероятно, лучше иметь системный метод установки, который выбирает подходящее имя для скрипта при его установке.
В UNIX-подобные системам .pl расширение в основном безвредно, и если вы найдете его полезным в качестве напоминания о том , что язык используется конкретным сценарием (возможно , у вас есть коллекция .pl , .py , .sh , и .rb скриптов), то вы можете сделать это. Но у этого подхода есть недостатки, как описано в книге: если вы переопределите скрипт на другом языке, вам придется изменить имя и обновить все, что его вызывает.
( Модули Perl должны иметь .pm расширение, чтобы Perl мог их найти. Например, это:
заставит интерпретатор искать файл с именем Bar.pm в каталоге, указанном Foo в одном из каталогов, перечисленных в @INC массиве. Но .pm файлы не предназначены для непосредственного выполнения.)
Это единственный источник, который я видел в этом представлении, все остальное, что я прочитал, поддерживает .pl расширение.
Я нахожу это удивительным. В большинстве советов, которые я видел, говорится, что не следует использовать .pl расширение для исполняемых скриптов.
Репутация: нет
Всего: нет
Суть проблемы:
есть путь к директории, необходимо получить имена всех файлов в ней хранящихся.
(что-то типа команды dir в ДОСе, только она еще и имена директорий выводит, это не нужно)
Подскажите пожалуйста, как реализовать на Perl.
Спасибо заранее.
Репутация: 1
Всего: 39
Репутация: 2
Всего: 83
Чем дальше в лес, тем толще партизаны.
Репутация: 1
Всего: 39
Репутация: нет
Всего: 14
Репутация: 2
Всего: 83
Чем дальше в лес, тем толще партизаны.
Репутация: нет
Всего: нет
Спасибо большое, проблема решена.
Репутация: 31
Всего: 61
Цитата |
Спасибо большое, проблема решена. |
Э-эээ подожди. Дело в том, что вариант с glob менее эфективен чем opendir(), readdir() и closedir(). Если в каталоге будет слишком много файлов, то glob не вернёт все файлы, так как она имеет ограничение на кол-во файлов, в отличии от readdir(). "Время проходит", - привыкли говорить вы по неверному пониманию.
"Время стоит - проходите вы".
Репутация: 1
Всего: 39
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
Репутация: нет
Всего: нет
Репутация: 31
Всего: 61
"Время стоит - проходите вы".
Репутация: 2
Всего: 83
Чем дальше в лес, тем толще партизаны.
Репутация: нет
Всего: нет
GoodBoy
спасибо. постараюсь прикрутить к основному скрипту.
Репутация: нет
Всего: нет
Репутация: нет
Всего: 9
я не думаю что это быстрее . но зато короче ;)
Репутация: нет
Всего: нет
Репутация: нет
Всего: нет
Подскажите плиз, есть директория с картинками вида:
Цифры не попорядку, могут быть дырки.
Мне надо узнать самую большую цифру, чтобы писать в директорию новую картинку с большей цифрой на единицу.
Подскажите плиз, как наиболее эффективно это сделать.
Добавлено через 6 минут и 29 секунд
Пока сваял такого монстра:
Но это ж ужас скоко работы для одной циферки ((((
Да, картинок сейчас около 25000 в директории, будет еще больше.
Репутация: 38
Всего: 40
Добавлено через 5 минут и 49 секунд
ну и самое простое -- записывать имя самого последнего созданного файла.
Репутация: 38
Всего: 49
Этот вариант, кроме того, позволит (при использовании блокировки) правильно работать нескольким одновременно запущенным экземплярам программы.
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
- В этом разделе обсуждаются общие вопросы по языку Perl
- Если ваш вопрос относится к системному программированию, задавайте его здесь
- Если ваш вопрос относится к CGI программированию, задавайте его здесь
- Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
- Справочное руководство "Установка perl-модулей", можно скачать здесь
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.
[ Время генерации скрипта: 0.1882 ] [ Использовано запросов: 21 ] [ GZIP включён ]
В Perl предусмотрен набор унарных операций, возвращающих значение только одного поля структуры индексного дескриптора. Эти операции в документации называются "операциями -X", так как их названия состоят из дефиса с последующим единственным символом. Все они являются унарными именованными операциями и имеют свой приоритет в сложных выражениях.
Полный перечень унарных операций проверки файлов
-r Файл может читаться эффективным uid/gid -w Записывать в файл может эффективный uid/gid -x Файл может выполняться эффективным uid/gid -o Владельцем файла является эффективный uid/gid -R Файл может читаться действительным uid/gid -W Записывать в файл может действительный uid/gid -X Файл может выполняться действительным uid/gid -O Владельцем файла является действительный uid/gid -e Файл существует -z Размер файла равен нулю -s Размер файла отличен от нуля (возвращает размер) -f Файл является обычным (plain) файлом -d Файл является каталогом -l Файл является символической ссылкой -p Файл является именованным програмным каналом (FIFO) или проверяемый дескриптор связан с програмным каналом -S Файл является сокетом -b Файл является специальным блочным файлом -c Файл является специальным символьным файлом -t Дескриптор файла связан с терминалом -u У файла установлен бит setuid -g У файла установлен бит setgid -k У файла установлен бит запрета (sticky bit) -T Файл является текстовым файлом -B Файл является двоичным (противоположным текстовому) -M Возраст файла в днях на момент выполнения программы -A То же для врмени последнего обращения к файлу -C То же для время последней модификации индексного дескриптора файла
Унарные операции применяются к строке, содержащей имя файла, к выражению, вычисляемым значением которого является имя файла, или к файловому дескриптору Perl. Если параметр операции не задан, то она тестирует файл, чье имя содержится в специальной переменной $_. Каждая операция проверки атрибута файла возвращает 1, если файл обладает соответствующим атрибутом, пустую строку "" в противном случае и неопределенное значение undef, если указанный в параметре файл не существует.
Несколько слов об алгоритме определения текстовых и двоичных файлов (операции -T и -B). Эти операции анализируют содержимое первого блока файла на наличие "странных" символов - необычных управляющих последовательностей или байтов с установленными старшими битами. Если обнаружено достаточно большое количество подобных символов (больше 30%), то файл считается двоичным, иначе текстовым. Любой файл с пустым первым блоком рассматривается как двоичный.
Если эти операции применяются к файловым дескрипторам Perl, то проверяется содержимое буфера ввода/вывода, а не первого блока файла. Обе эти операции, примененные к файловым дескрипторам, возвращают булево значение Истина, если связанный с дескриптором файл пуст или установлен на конец файла.
При выполнении унарных именованных операций проверки файла на самом деле неявно вызывается функция stat(), причем результаты ее вычисления кэшируются, что позволяет использовать специальный файловый дескриптор _ для ускорения множественных проверок файла:
chdir
Изменение текущего рабочего каталога на каталог, определяемый значением параметра ВЫРАЖЕНИЕ. Если параметр опущен, домашний каталог становится текущим. Возвращает бклево значение Истина в случае успешного выполнения операции замены текущего каталога и Ложь в противном случае.
chmod
Функция chmod() изменяет права доступа для файлов, представленных в списке, переданном ей в качестве параметра. Первым элементом этого списка должно быть трехзначное восьмеричное число, задающее права доступа для владельца, пользователей из группы, в которую входит владелец, и прочих пользователей. Каждая восьмеричная цифра определяет право на чтение файла, запись в файл и его выполнение (в случае если файл представляет выполняемую программу) для указанных выше групп пользователей. Установленные биты ее двоичного представления отражают соответствующие права доступа к файлу. Например, если установлены все три бита (восьмеричное число 7), то соответствующая группа пользователей обладает всеми перечисленными правами: может читать из файла, записывать в файл и выполнять его. Значение равное 6 определяет право на чтение и запись, 5 позволяет читать из файла, выполнять его, но не позволяет записывать в этот файл и т.д. Обычно не выполняемый файл создается с режимом доступа 0666 - все пользователи могут читать и записывать информацию в файл, выполняемый файл - с режимом 0777. Если владелец файла желает ограничить запись в файл пользователей не его группы, то следует выполнить следующий оператор:
Возвращаемым значением функции chmod(), как и функции chown(), является количество файлов из списка, для которых операция изменения прав доступа завершилась успешно.
В операционных системах DOS и Windows имеет значение только установка режимов доступа владельца.
chown
Любой пользователь, создавший собственный файл, считается его владельцем. Изменить владельца файла из сценария Perl можно функцией chown(). Параметром этой функции является список, первые два элемента которого должны представлять числовые идентификаторы uid и gid. Остальные элементы списка являются именами файлов, для которых изменяется владелец. Эта функция возвращает количество файлов, для которых операция изменения владельца и группы прошла успешно.
Изменить владельца файла может только сам владелец или суперпользователь (обычно системный администратор) системы UNIX. В операционных системах с файловой системой отличной от UNIX (DOS, Windows) эта функция отрабатывает, но ее установки не влияют на доступ к файлу.
chroot
Определяет новый корневой каталог для всех относительных (начинающихся с косой черты "/") имен файлов процесса пользователя и порожденных им процессов. Не меняет текущий рабочий каталог. В отсутствии параметра используется значение специальной переменной $_. Может вызываться только суперпользователем.
close
По завершению работы с файлом он закрывается функцией close(). Единственным необязательным параметром этой функции является дескриптор, ассоциированный с файлом.
Эта функция возвращает значение Истина, если успешно очищен буфер ввода/вывода и закрыт системный дескриптор файла. Вызванная без параметра, функция close закрывает файл, связанный с текущим дескриптором, установленным функцией select().
При возникновении ошибок закрытия файла их можно обнаружить применяя специальную переменную $!: close ( FILE ) or die "Ошибка закрытия файла: $!";
closedir
Закрывает каталог, ассоциированный с дескриптором каталога, заданным параметром ДЕСКРИПТОР. Возвращает булево значение Истина, если каталог успешно закрыт.
fcntl
Реализует системную команду Unix fcntl(2). Перед использованием следует получить доступ к определениям системных констант оператором use Fcntl.
Возвращаемое значение: если системная функция возвращает -1, то функция Perl - неопределенное значение; если системная функция возвращает 0, то функция Perl строку "0 but true"; если системная функция возвращает какое-либо другое значение, функция Perl возвращает это же значение.
Возвращает найденные в текущем каталоге файлы, имена которых удовлетворяют заданному шаблону (с использованием метасимволов Unix "*","?"). Значением выражения должна быть строка, содержащая шаблон имен файлов.
ioctl
Реализует системную команду Unix ioctl(2). Перед использованием следует получить доступ к определениям системных констант оператором require "ioctl.ph";
- если системная функция возвращает -1, то функция Perl - неопределенное значение;
- если системная функция возвращает 0, то функция Perl строку "0 but true";
- если системная функция возвращает какое-либо другое значение, функция Perl возвращает это же значение.
Создает новую "жесткую" ссылку на файл, заданный параметром СТАРЫЙ. Возвращает булево значение Истина в случае успешного создания ссылки и Ложь в противном случае.
lstat
Возвращает список значений полей структуры индекснего дескриптора символической ссылки на файл. Если параметр опущен, то используется значение специальной переменной $_.
Используется для получения информации о символических ссылках. Возвращает список значений полей структуры индексного дескриптора самой ссылки, а не файла, на который она ссылается. Эта функция работает аналогично функции stat().
mkdir
Для доступа к файлу из программы Perl необходим дескриптор. Для создания дескриптора используется функция open(). При выполнении операции open с заданым в параметрах именем файла открывается соответствующий файл и создается дескриптор этого файла. В качестве дескриптора файла можно использовать выражение - его значение и будет именем дескриптора. Имя файла задается непосредственно в виде строкового литерала или выражения, значением которого является строка. Операция open без имени файла открывает файл, имя которого содержится в скалярной переменной $ДЕСКРИПТОР, которая не может быть лексической переменной, определенной функцией my().
Если задано не полное имя файла, то открывается файл с указанным именем и расположенный в том же каталоге, что и программа Perl. Можно задавать полное имя файла, однако следует иметь в виду, что оно зависит от используемой операйионной системы. Например, в Windows следует обязательно задавать имя диска: d:/perlbook/file1.doc
Любой файл можно открыть в одном из следующих режимов: чтения, записи или добавления в конец файла. Это осуществляется присоединением соответствующего префикса к имени файла:
- < (чтение)
- > (запись)
- >> (добавление)
Если префикс опущен, то по умолчанию файл открывается в режиме чтения.
Запись информации в файл, открытый в режиме записи, осуществляется в начало файла, что приводит к уничтожению содержащейся в нем до его открытия информации.
Информация, содержащаяся в файле, открытом в режиме добавления, не уничтожается, новые записи добавляются в конец файла.
Если при открытии файла в режиме записи или добавления не существует файла с указанным именем, то он создается, что оличает эти режимы открытия файла от режима чтения, при котором файл должен существовать. В противном случае операция открытия завершается с ошибкой и соответствующий дескриптор не создается.
Perl позволяет открыть файл еще в одном режиме - режиме чтения/записи.
Для этого перед префиксом чтения <, записи > или добавления >> следует поставить знак +.
- +< - сохраняют содержимое открываемого файла
- +> - сначало очищает содержимое открываемого файла
- +>> - сохраняют содержимое открываемого файла, запись в файл всегда осуществляется в конец содержимого файла
opendir
Открытие каталога, имя которого равно значению параметра ВЫРАЖЕНИЕ, и связывает его с дескриптором, определяемым параметром ДЕСКРИПТОР. Имена дескрипторов каталогов хранаятся в собственном пространстве имен таблицы имен Perl.
readlink
rename
Переименовывает файл. Возвращает 1 в случае успешного переименования и 0 в противном случае.
В файловой структуре UNIX информация о файле храниться в его индексном дескрипторе (inode). Структура индексного дескриптора состоит из 13 полей, для которых используются специальные обозначения:
Поле | Описание |
dev | Номер устройства в файловой системе |
ino | Номер индексного дескриптора |
mode | Режим файла (тип и права доступа) |
nlink | Количество жестких ссылок на файл (в отсутствии ссылок равно 1) |
uid | Числовой идентификатор владельца файла |
gid | Числовой идентификатор группы владельца файла |
rdev | Идентификатор устройства (только для специальных файлов) |
size | Размер файла в байтах |
atime | Время последнего обращения к файлу с начала эпохи |
mtime | Время последнего изменения файла с начала эпохи |
ctime | Время изменения индексного дескриптора с начала эпохи |
blksize | Предпочтительный размер блока для операций ввода/вывода |
blocks | Фактическое количество выделенных блоков для размещения файла |
Начало эпохи датируется 1 января 1970 года 0 часов 0 минут.
Не все перечисленные поля структуры индексного дескриптора поддерживаются всеми файловыми системами.
Функция stat() предназначена для получения значений полей структуры индексного дескриптора файла. Ее единственным параметорм может быть либо имя файла, либо дескриптор открытого в программе файла. Она возвращает список из 13 элементов, содержащих значения полей структуры индексного дескриптора файла в том порядке, как они перечислены в таблице.
Типичное использование в программе Perl представлено ниже:
Присваивание значение полей списку скалярных переменных с идентификаторами, соответствующими названиям полей, способствует лучшей читаемости программы, чем присваивание массиву скаляров:
В последнем случае получить значение соответствующего поля можно только с помощью индекса, что не совсем удобно, так как нужно помнить номер нужного поля структуры.
Если при обращении к функции stat() не указан параметр, то она возвращает структуру индексного дескриптора файла, чье имя содержится в специальной переменной $_.
Функция получения информации о файле при успешном выполнении в списковом контексте возвращает список значений полей структуры индексного дескриптора файла или пустой список в случае неудачного завершения. В скалярном контексте она возвращает булево значение Истина или Ложь в зависимости от результатов своего выполнения.
Для удобства использования информации о файле функция stat() при успешном выполнении кэширует полученные значения полей. Если вызвать эту функцию со специальным дескриптором файла _ (символ подчеркивания), то она возвратит информацию, хранящуюся в кэше от предыдущего ее вызова. Это позволяет проверять различные атрибуты файла без повторного вызова функции stat() или сохранения результатов ее выполнения в переменных программы.
Функцию stat() можно использовать для получения структуры индексного дескриптора не только файла, но и жестких ссылок на него, а также каталогов, так как они являются также файлами, блоки данных которых содержат имена файлов каталога и их числовых индексных дескрипторов.
symlink
Создание символической ссылки (параметр НОВОЕ_ИМЯ) на файл (параметр СТАРОЕ_ИМЯ). Возвращает 1 в случае успешного создания символической ссылки и 0 в противном случае.
umask
Устанавливает маску режима доступа процесса, заданную значением параметра ВЫРАЖЕНИЕ (восьмеричное число), и возвращает предыдущее значение маски режима доступа.
unlink
Удаление файлов, определенных параметром СПИСОК. Возвращает количество успешно удаленных файлов.
utime
В структуре индексного дескриптора файла существует три поля, в которых храниться время последнего обращения (atime) к файлу, его изменения (mtime) файла и изменения индексного дескриптора (ctime). Функцией utime() можно изменить время последнего обращения и модификации файла. Ее параметром является список, содержащий имена обрабатываемых файлов, причем первые два элемента списка - числовые значения нового времени последнего доступа и модификации:
В этом фрагменте кода время последнего доступа и модификации файлов из списка @files изменяется на текущее время, полученное с помощью функции time.
Отметим, что при выполнении функции utime() изменяется и время последней модификации индексного дескриптора (ctime) - оно устанавливается равным текущему времени. Возвращаемым значением является количество файлов, для которых операция изменения времени последнего доступа и модификации прошла успешно.
О том, что такое файл писать я надеюсь ненужно, но думаю нужно подумать над тем, что с ними можно делать, как видно из заголовка статьи, на Perl. Ну, приступим .
В этой статье обсудим:
Что такое файловые манипуляторы, и с чем их едят
Доступ к файлам осуществляется с помощью файловых манипуляторов, которые представляют собой так сказать синоним файла. Они не являются переменными, а поэтому их нельзя непосредственно присваивать другим переменным или передавать в функции (для этого нужно, что называется, пойти другим путем).
Есть и стандартные Перловские файловые манипуляторы. Они называются STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (стандартный поток ошибок). Например параметры скрипту из формы передаются именно через STDIN (при условии использования метода POST).
Если понадобится создать копию файлового манипулятора (не файла, а только манипулятора по которому осуществляется доступ к файлу), то можно воспользоваться функцией open (о ней подробнее поговорим позже).
О присваивании переменным файловых манипуляторов:
И под конец скажу, что файловые манипуляторы в Perl используются не только для связи с, собственно, файлом. Они могут быть связаны с каким-нибудь процессом, сокетом и т.д. Но это не входит в тематику статьи.
Манипуляции с файлом
Открытие файла осуществляется функцией open.
Разберемся. У функции три параметра: FFF - название файлового манипулятора (его задаете вы), режим доступа ">" и "file.txt" - имя нужного вам файла. Есть три основных режима: ">" - запись,"<"- чтение, ">>"- добавление в файл.
Есть еще функция sysopen. Работа с ней не на много сложнее, чем с open, зато с ее помощью вы сможете более детально "сказать" системе о ваших намерениях (то есть то, что вы хотите сделать с файлом).
В sysopen три обязательных параметра и один необязательный.
FH - собственно, файловый манипулятор, $name - имя файла в чистом виде (без ">" и др.). В $flags помещаем число, полученное объединением нижеописанных констант через OR ( | ):
O_RDONLY | Только для чтения |
O_WRONLY | Только для записи |
O_RDWR | Для чтения и для записи |
O_CREAT | Если файла нет, создать! |
O_APPEND | Открытие в режиме присоединения |
O_TRUNC | Очищаем содержимое при открытии |
Это, конечно, не полный перечень, но здесь перечислены самые необходимые и часто используемые константы.
И наконец $param. Этот параметр задает маску доступа к файлу и записывается в восьмеричной системе. Обычно используется значение 0666 (значение по умолчанию, то есть если $param опущен), или 0777. Первое значение используется для обычных файлов, второе же для каталогов и исполняемых файлов.
Пример открытия файла для записи (если не найден - создается):
Запись в файл делаем функцией print.
Здесь FFF - имя файлового манипулятора, а строка в кавычках - текст, который мы хотим записать в файл, ассоциированный с FFF.
Если до попытки открытия файла не существовало, то функция open его создаст, а если файл был, и он был не пустой, то после вышеуказанной функции print, в нем ничего не останется от предыдущей информации, а записана будет та ерунда, которую я там вписал.
Как уже было сказано, существуют три стандартных файловых манипулятора, и при опущенном файловом манипуляторе функция print осуществит вывод в STDOUT (то же относится к функциям printf и write). Чтобы изменить направление вывода в Perl предусмотрена функция select (правда не только для этого). Пример:
Закрываем файл функцией close.
Принцип убирать за собой прививается всем с детства. Давайте не забывать об этом и в программировании, хотя при завершении процесса, в котором был открыт данный файл, файл закрывается автоматически.
Во-первых для чего? А для того, что если несколько процессов хотят одновременно заполучить доступ к файлу, причем на запись, причем еще и хотят туда что-то писать (кошмар), то представьте, что оказалось бы, если не этот чудный механизм блокировки. Он позволяет, грубо говоря, ставить процессы в очередь. Делаем так:
О функциях open и close уже говорили, а на flock остановимся немного подробнее. Она получает два параметра - файловый манипулятор и, образно говоря, категорию блокировки.
Про снятие блокировки: блокировка автоматически снимается при завершении процесса, вызванного текущим скриптом, либо при закрытии файлового манипулятора, который "привязан" к заблокированному файлу. Если вы снимаете блокировку вручную, будьте аккуратны - вы даете возможность другому процессу делать с (ВНИМАНИЕ!) не закрытым вами файлом все что ему угодно! Последствия могут быть, мягко говоря, неприятные, а грубо говоря - непредсказуемые (для вас непредсказуемые).
Работа со строками в файле
Так как именно те файлы, которые содержат строковую информацию составляют наибольший интерес для, собственно, человека, то и речь сейчас пойдет именно о них.
Для чтения строк из файла используется файловый манипулятор "поставленный" в <>.
Если не указано иначе, то внутри такого цикла используется стандартная переменная "$_", а номер строки записывается в "$.". Так как конец строки обозначается спецсимволом, например "\n", для получения самой строки (без эдакого "хвоста") нужно ее усечь функцией chomp.
Можно прочитать строки в массив:
Для передвижения по файлу используются функции tell и seek.
Функция tell принимает в качестве параметра файловый манипулятор, а seek берет три параметра. Первый - файловый манипулятор, второй - смещение в байтах, третий - направление смещение. Есть три направления смещения: 0 - от начала файла, 1 - от текущей позиции, 2 - с конца файла.
Нельзя сказать, что это все, что нам предлагает Perl для работы с файлами. Будем надеяться, что у меня будет время на то, чтобы написать о том, как работать с каталогами, тонкости при работе с бинарными файлами, объектно-ориентированный подход к управлению файлами и их содержимым.
Читайте также: