Ни одна программа не может функционировать сама по себе, не получая и не посылая информацию во внешнюю среду. Perl предоставляет несколько способов получения программой данных извне и вывода информации из выполняющегося сценария. В процессе функционирования программы может потребоваться выполнить некоторую команду операционной системы и проанализировать результаты ее выполнения, прочитать данные из внешнего файла или группы файлов, записать результаты вычислений во внешний файл или отобразить их на экране монитора - все эти действия реализуются разнообразными операциями и функциями языка Perl.
Простейшее взаимодействие с операционной системой, в которой выполняется программа Perl, реализуется операцией заключения строки данных в обратные кавычки. Содержимое такой строки передается на выполнение операционной системы, которая возвращает результат выполнения команды в эту же строку.
Для чтения из файла используется операция "ромб" о, которой в качестве операнда передается дескриптор файла. В этой главе мы не будем обсуждать ввод из файла через его дескриптор, отнеся рассмотрение этого вопроса в следующую главу, полностью посвященную работе с файлами. Здесь мы расскажем о том, как работает операция "ромб" в случае отсутствия операнда, представляющего дескриптор файла. В этом случае эта операция может читать записи из стандартного файла ввода STDIN или получать информацию, передаваемую программе через командную строку.
Для отображения в стандартный файл вывода STDOUT используется уже знакомая
нам функция print, которая, однако, может выводить информацию и в файл, определенный
своим дескриптором.
6.1. Операция ввода команды
Заключенная в обратные кавычки " " строка символов является всего лишь удобной формой записи операции ввода команды операционной системы qx{}, с которой мы уже знакомы (см. главу 4).
Когда интерпретатор Perl встречает строковый литерал в обратных кавычках,
он осуществляет подстановку в нее значений скалярных переменных и переменных
массивов и передает получившуюся строку, как команду, на выполнение операционной
системе. Последняя выполняет ее и возвращает в строковый литерал результаты
вывода команды на стандартное устройство вывода, которым обычно является экран
монитора. В связи с таким "поведением" строкового литерала в обратных
кавычках его иногда называют псевдолитералом.
Операция ввода команды различает скалярный и списковый контексты, в которых она может выполняться. В скалярном контексте возвращается одна строка, содержащая весь вывод на экран монитора выполненной команды, включая символы новой строки в случае многострочного вывода. В списковом контексте возвращается список значений, каждое из которых содержит одну строку вывода. Пример 6.1 демонстрирует использование операции ввода команды в соответствующих контекстах.
#! peri -w
$command = "dir";
$scalar = ~$command"; # Скалярный контекст. ,
@list = "$command~; # Списковый контекст.
Print $scalar;
Print $list, $list, $list;
Теперь, в отличие от примера 6.1, элемент массива $iist содержит вывод команды до следующей встретившейся последовательности СИМВОЛОВ "<КАТАЛОГ>" И Т. Д.
Команда, содержащаяся в псевдолитерале, выполняется всякий раз, как вычисляется этот псевдолитерал. Встроенная переменная $? содержит числовое значение состояния выполненной команды.
(Об интерпретации значений встроенной переменной $ ? см. главу 14.)
Хотим обратить внимание читателя еще раз на тот факт, что операция ввода команды возвращает вывод на стандартное устройство вывода операционной системы. При выполнении команды можно направить ее вывод на другое устройство, например, в файл. Для этого в строке после имени команды и всех необходимых для ее выполнения параметров следует задать символ ">", после которого ввести имя файла. В этом случае на экран монитора ничего выводиться не будет, а следовательно и ничего не будет возвращаться в псевдолитерал, т. е. после выполнения такой команды псевдолитерал будет содержать неопределенное значение (пример 6.3).
#! peri -w - $/ = "<КАТАЛОГ>";
$list = "dir >file.dat~; # Вывод осуществляется в файл file.dat print $list; # Оператор ничего не напечатает!
6.2. Операция о
Для нашего читателя эта операция не является совсем уж новой. Несколько слов о ней было сказано в главе 4;
в некоторых примерах мы ее использовали для ввода пользователем данных в программу Perl. Основное ее назначение - прочитать строку из файла, дескриптор которого является операндом этой операции. (Операнд операции о расположен внутри угловых скобок.) Мы не будем сейчас объяснять, что такое дескриптор файла, зачем он нужен и какую функцию выполняет в программах Perl. Эти вопросы будут нами подробно рассмотрены в следующей главе, посвященной работе с файлами. Здесь же мы остановимся на специальном случае использования этой операции - операции с пустым операндом о. В этом случае ввод осуществляется или из стандартного файла ввода, или из каждого файла, перечисленного в командной строке при запуске программы Perl. Но прежде чем перейти к описанию функционирования операции ввода с пустым операндом, остановимся на некоторых понятиях, необходимых для понимания дальнейшего.
Для обеспечения единообразия работы программ Perl в разных операционных системах при их запуске открывается несколько стандартных файлов. Один из них предназначен для ввода данных в программу и связан со стандартным устройством ввода - клавиатурой. Этот файл и называется стандартным файлом ввода и имеет дескриптор STDIN. Для вывода информации из программы создается стандартный файл вывода, также связанный со стандартным устройством вывода операционной системы, которым является экран монитора компьютера. Этому стандартному файлу назначается дескриптор STDOUT. Для отображения разнообразных сообщений о возникающих в процессе выполнения программы ошибках создается стандартный файл ошибок, который связан со стандартным устройством вывода. Этот файл имеет дескриптор STDERR. Эти файлы не надо создавать и открывать - они уже существуют, когда наша программа начинает выполняться. Иногда их называют предопределенными файлами ввода/вывода. Таким образом, если мы, например, говорим о том, что ввод осуществляется из стандартного файла (или стандартного устройства), мы имеем в виду стандартный файл ввода с дескриптором STDIN.
При запуске программы Perl в системе UNIX или из командной строки Windows ей можно передать параметры. Эти параметры задаются после имени файла, содержащего программу Perl, и отделяются от него и друг от друга пробелами:
peri program.pl parl par2 рагЗ
Параметрами могут быть ключи (обычно символ с лидирующим дефисом, например,
-v), которые устанавливают определенные режимы работы программы, или имена файлов,
содержимое которых должна обработать программа. Все передаваемые в программу
параметры сохраняются в специальном встроенном массиве @ARGV. Если не передается
ни одного параметра, то этот массив пуст.
Операция о без операнда, употребленная в циклах while и for, при первом своем
вычислении проверяет, пуст ли массив @ARGV. Если он пуст, то в первый элемент
этого массива $ARGV[O] заносится символ "-" и операция ожидает ввода
пользователя из стандартного файла ввода STDIN. Если массив @ARGV не пуст, то
он содержит параметры, переданные программе при ее запуске. Операция о трактует
каждый из них как имя файла и в цикле передает в программу последовательно все
строки всех файлов, указанных в командной строке. Рассмотрим простейшую программу
(пример 6.4), состоящую из одного цикла while с операцией <>, и рассмотрим
ее поведение при разных способах запуска.
i! peri -w
While ($line = <>) {
print $line; }
При ее запуске без параметров она будет ожидать ввода пользователя с клавиатуры и в цикле распечатывать вводимые им строки, пока пользователь не завершит ввод комбинацией клавиш
Если при запуске передать ей имя файла, например, файла, содержащего саму же программу,
peri examp6_4.pi examp6_4.pi
То программа примера 6.4 распечатает его содержимое:
F! peri -w
While ($line = <>) {
Print $line; }
Если эту же программу запустить, задав в командной строке дважды имя файла программы,
peri examp6_4.pl examp6_4.pl examp6_4.pl
То программа дважды распечатает свой собственный текст.
При выполнении операции ввода из файла встроенная переменная $. на каждом шаге цикла хранит номер прочитанной строки файла. В случае задания нескольких имен файлов в командной строке при последовательном вводе их строк операцией о эта переменная продолжает увеличивать свое значение при переходе на чтение строк очередного файла, т. е. она рассматривает содержимое всех файлов как один-единственный файл.
Операцию о и массив @ARGV можно совместно использовать для ввода в программу содержимого нескольких файлов, не связывая их с заданием имен файлов в командной строке. В любом месте программы перед первым использованием в цикле операции ввода <> можно в массив SARGV занести имена файлов, содержимое которых необходимо обработать:
@ARGV = ("filel.dat", "file2.dat",
"file3.dat"); for (;<>;) {
Операторы обработки строк файлов }
Этот фрагмент программы в цикле for последовательно обработает строки трех файлов filel.dat, file2.dat и file3.dat. Здесь же продемонстрирована еще одна интересная особенность операции ввода о. Обычно прочитанная этой операцией строка присваивается скалярной переменной, как это происходило в примере 6.4, но если эта операция одна представляет выражение условия цикла, то результат ее выполнения сохраняется в специальной встроенной переменной $_. Цикл while программы примера 6.4 можно записать и так:
While (<>) (print;
}
Здесь также используется то обстоятельство, что функция print без параметров по умолчанию выводит содержимое переменной $_.
Если мы хотим передать в программу некоторые ключи, устанавливающие режим ее работы, то в начале программы следует поместить цикл, который проверяет содержимое массива @ARGV на наличие ключей в командной строке вызова программы. Один из способов подобной проверки приводится в примере 6.5, где предполагается, что программе могут быть переданы ключи
D, -s И -е.
f! peri -w
while ($_ = $ARGV, / A -/) {
if(/ A -d/) { print $ARGV,"\n";}
if(/ A -s/) { print $ARGV-, "\n"; }
1£(/ Л -е/) { print $ARGV,"\n"; }
shift; }
При вычислении выражения условия цикла while осуществляется присваивание переменной $_ значения первого элемента массива @ARGV и проверка присутствия дефиса "-" в качестве первого символа содержимого этой переменной (операция / Л -/). Операторы if проверяют содержимое переменной $_ на соответствие известным ключам и отображают их. (В реальных программах в этих операторах обычно определяют некоторые переменные, которые в дальнейшем используются для выполнения действий, присущих соответствующим ключам.) Функция shift удаляет из массива @ARGV первое значение, сдвигая оставшиеся в нем элементы на одну позицию влево: второй становится первым, третий вторым и т. д. Цикл повторяется до тех пор, пока переданные через командную строку параметры начинаются с дефиса. Еще одно применение операции <> связано с получением в программе имен файлов определенного каталога, удовлетворяющих заданному шаблону. Если в качестве операнда этой операции используется шаблон имен файлов, то в скалярном контексте она возвращает первое найденное имя файла в текущем каталоге, в списковом контексте - список имен файлов, удовлетворяющих заданному шаблону. (В шаблоне можно использовать метасимволы: * для произвольной цепочки символов, ? для произвольного одиночного символа.) Если в каталоге не найдены файлы с именами, удовлетворяющими шаблону, то операция возвращает неопределенное значение. Например, выполнение следующей операции
$first = <*.pl>;
Приведет к сохранению в переменной $ first имени первого файла из списка всех файлов текущего каталога с расширением pi, если таковые файлы в каталоге есть, иначе эта переменная будет иметь неопределенное значение. В списке файлы упорядочены в алфавитном порядке. Эта же операция в списковом контексте
Gfiles = <*.pl>;
Возвращает список всех файлов с расширением pi. После выполнения этой операции элементы массива @files содержат имена всех файлов с расширением pi.
Если при задании шаблона файла явно указать каталог, то эта операция возвратит список файлов из указанного каталога, имена которых удовлетворяют заданному шаблону. Например, операция
@files = ;
Сохранит в массиве @flies имена всех файлов каталога /peri с расширением pi.
При использовании этой операции в выражении условия цикла while или for она последовательно на каждом шаге цикла возвращает очередное имя файла, удовлетворяющее заданному шаблону:
While ($file = <*.pl>) (
print "$file\n"; }
Употребленная в выражении условия самостоятельно, эта операция возвращает очередное имя файла в переменной $_. Например, предыдущий фрагмент можно переписать следующим образом:
While (<*.pl>) {
Print $_, "\п"; }
Операция получения имен файлов, соответствующих заданному шаблону, реализуется с помощью внутренней функции glob, единственным параметром которой является шаблон имен файлов. Эту функцию можно использовать самостоятельно для получения соответствующих имен файлов:
@scripts = glob "*.pl";
В скалярном контексте она возвращает имя первого файла, удовлетворяющего заданному
шаблону, в списковом - список имен всех файлов. Употребленная без параметра,
она использует в качестве параметра специальную переменную $_.
6.3. Функция print
Функция print наиболее часто используемая функция для вывода информации из сценария Perl. Ее синтаксис имеет следующий вид:
print ДЕСКРИПТОР СПИСОК;
Здесь ДЕСКРИПТОР представляет дескриптор файла, в который функция выводит строковые данные, представленные списком вывода список. Он может состоять из переменных, элементов массивов и выражений, вычисляемых как строковые данные. Дескриптор файла создается функцией open 0,0 которой мы поговорим в следующей главе. Он может быть опущен, и в этом случае вывод осуществляется в стандартный файл вывода STDOUT, если только функцией select о не выбран другой файл вывода по умолчанию. Как уже отмечалось ранее, обычно стандартное устройство вывода - экран монитора компьютера.
Функция print при выводе своего списка не завершает его символом новой строки "\п". Это означает, что следующая функция print начнет вывод на экран непосредственно после последнего выведенного предыдущей функцией print символа. Если такое поведение не желательно, то следует список вывода каждой функции print явно завершать строкой, содержащей символ новой строки, или включать его последним символом последнего элемента списка вывода. Пример 6.6 демонстрирует вывод с помощью функции print.
#! peri -w
print "String 1:";
Print "String 2:\n";
Print "String 3:", "\n";
print STDOUT "String 4:\n";
print FILEOUT "String 4:\n";
Вывод первых четырех функций print примера 6.6 представлен ниже:
String I:String 2: String 3: String 4:
Вторая функция print начинает свой вывод на той же строке, на которой завершила
вывод первая функция, в которой в списке вывода нет символа перехода на новую
строку. В четвертой функции явно указан дескриптор стандартного файла вывода
STDOUT. Относительно пятой функции скажем, что она ничего ни в какой файл, определенный
дескриптором FILEOUT, не выведет, так как с этим дескриптором не связан никакой
файл. Для этого следовало бы до выполнения последней функции print открыть файл
функцией open о и связать с ним дескриптор FILEOUT. Мы отложим эти вопросы до
следующей главы.
Функция print, как и большинство других функций, определенных в языке Perl, является списковой операцией, и все элементы списка вывода вычисляются в списковом контексте. Это обстоятельство следует учитывать при использовании в качестве элементов списка вывода выражений с вызовами подпрограмм.
Все, что было сказано относительно списковых операций и их использования в качестве термов выражений в главе 4, относится, естественно, и к функции print. Если ее параметры, включая дескриптор файла, заключены в круглые скобки, то такая синтаксическая конструкция считается термом
и в выражении имеет наивысший приоритет вычисления. Например, следующий оператор
Print ($m + $n) ** 2;
Напечатает сумму значений переменных $т и $п, а не их сумму, возведенную в квадрат. Компилятор peri, обнаружив после лексемы print левую круглую скобку, найдет правую круглую скобку и будет рассматривать их содержимое как список параметров функции print. А так как такая конструкция есть терм, то сначала будет выполнена операция печати суммы значений переменных, а потом результат этой операции (Истина =1) будет возведен в квадрат. Добавление необязательного дескриптора стандартного файла вывода STDOUT исправит подобную ошибку:
print STDOUT ($m + $n) ** 2; # Выведет ($m + $n) ** 2
Если в функции печати print не задан список вывода, то она по умолчанию выводит содержимое специальной переменной $_ в файл, определенный параметром ДЕСКРИПТОР:
print; # Выводится содержимое переменной $_ на экран монитора, print STDOUT; # Эквивалентен предыдущему оператору, print FILEOUT; # Выводится содержимое переменной $_ в файл # с дескриптором FILEOUT
* * *
В этой главе мы познакомились с основными возможностями ввода/вывода, предоставляемыми
языком Perl. Узнали, как легко и просто можно выполнить команду операционной
системы и получить результаты ее вывода на экран монитора непосредственно в
программу Perl. Операция <> позволяет не только считывать записи внешних
файлов, но и автоматически обрабатывать содержимое нескольких файлов, заданных
в командной строке при запуске сценария Perl. Эта же операция позволяет осуществлять
поиск файлов, чьи имена удовлетворяют заданному шаблону. Для вывода информации
из программы используется функция print о, которая может выводить ее не только
на экран монитора (стандартное устройство вывода), но также и во внешний файл.
Вопросы для самоконтроля
1. Каким образом можно получить результаты выполнения команды операционной системы в программе Perl?
3. Где хранятся имена параметров, переданных сценарию Perl через командную строку?
4. Можно ли получить в программе Perl имена файлов определенного каталога, удовлетворяющих заданному шаблону?
5. Какая списковая операция осуществляет вывод на экран монитора?
6. Какая списковая операция осуществляет вывод во внешний файл?
Упражнения
1. Напишите программу, которая копирует один файл в другой. Имена файлов передаются в программу при ее запуске как параметры командной строки. (Подсказка: используйте системную команду сору.)
2. Напишите программу, которая отображает на экране содержимое файлов, имена которых задаются в командной строке. Отображение содержимого каждого файла должно предваряться строкой, содержащей имя файла. (Подсказка: использовать операцию <>.)
3. Напишите программу Perl, которая удаляет файлы определенного каталога. Имена файлов задаются шаблоном, который вместе с именем каталога передается в программу через командную строку при ее запуске.
Две важнейших операции, касающиеся содержимого файлов - ввод (чтение) из файла и вывод (запись) в файл.
Для работы с содержимым файла программа должна его открыть . Открывая файл, мы указываем, что именно мы хотим с ним делать: читать или писать. Результатом открытия является так называемый файловый дескриптор - скалярное значение, хранящее сведения о текущем состоянии процесса чтения или записи. Операции чтения, записи и прочие операции ввода вывода в дальнейшем осуществляются через дескриптор.
Открывается файл при помощи встроенной процедуры open . Процедура получает три параметра: переменную для создаваемого дескриптора, строку, обозначающую режим открытия (чтение, запись или что-то ещё), и, наконец, имя файла:
Perl
my $file ; open $file , "<" , "MyFile.txt" ; открытие для чтенияМы обожаем совмещать объявление переменной для дескриптора с вызовом процедуры open:
Perl
open my $file , "<" , "MyFile.txt" ;Значение "<" , переданное как второй параметр, символизирует чтение. Знак «меньше», повернувшийся спиной к имени файла, как бы намекает нам, что готовится извлечение информации из файла. Угадайте, как открыть файл для записи? Конечно же так:
Perl
open my $file , ">" , "MyFile.txt" ; открытие для записиВ примерах использования процедуры open указывалось относительное имя файла - по отношению к директории, являющейся для данной программы текущей. Сразу после запуска программы это та директория, из которой запущена программа. Но текущая директория может быть изменена процедурой chdir:
Perl
chdir "/" ;Нет никаких противопоказаний к тому, чтобы задавать при открытии абсолютное имя файла:
Perl
open my $passwd , "<" , "/etc/passwd" ;В некоторых операционных системах, в полных именах файлов применяется другой разделитель директорий. Например, в Microsoft DOS и Microsoft Windows вместо слэша / применяется разделитель бэкслэш \ . Тем не менее, задавая полное имя в программе на Perl при открытии, следует использовать слэш: "/c:/dos/autoexec.bat" .
Интуиция подсказывает нам, что всё, что открывается, должно быть рано или поздно закрыто. Это верно и для файлов. Любой сценарий ввода/вывода устроен одинаково: открытие, собственно ввод или вывод, и, наконец, закрытие
Закрытие файла освобождает ресурсы операционной системы, занятые при открытии, и гарантирует, что данные, записанные в файл, дойдут по назначению. После закрытия переменная-дескриптор теряет актуальность и не может быть использована для ввода/вывода.
Для закрытия файлов служит встроенная процедура close:
Perl
close $file ;Не стоит ожидать, что открытие файла всегда будет успешным. Есть много причин, которые могут помешать. Среди них:
В этих и подобных случаях все дальнейшие операции с файлом потеряют всякий смысл и лишь приведут Perl в ярость. Однако процедура open в своём возвращаемом значении сообщает об итоге операции: при успехе возвращает истинное значение, а при неудаче - ложное. Хорошо написанная программа должна проверять это значение, и действовать в зависимости от него. Например, при неудачном открытии завершить работу программы с выдачей соответствующего сообщения:
Perl
if (open … ) { работа с файлом и последующее закрытие } else { die ; }Обратите внимание на специальную переменную $! . В случае возникновения ошибки в эту переменную автоматически помещается текст, объясняющий причину ошибки, например, Нет такого файла или каталога или Отказано в доступе или что-то ещё. Текст в $! , в зависимости от системных настроек, может быть на другом языке.
Гораздо изящней выглядит следующая идиома:
Perl
open … or die "Невозможно открыть файл: $!\n" ;В этом логическом выражении два операнда. Если первый (то, что возвращает open) принимает истинное значение, то в вычислении второго нет нужды, так как всё выражение уже заведомо истинно. Если же open возвратит ложное значение, то значение всего выражения определяется по второму операнду, который в этом случае должен быть вычислен. Для вычисления будет вызвана процедура die со всеми вытекающими последствиями.
Конечно, программа не обязана завершать работу при неудачном открытии файла. Например, если предполагается обработка нескольких файлов, можно просто перейти к следующему, сообщив об ошибке при помощи процедуры warn:
Perl
for (@fileNames ) { open my $file , "<" , $_ or warn "Невозможно открыть файл $_: $!" and next ; работа с очередным файлом и последующее его закрытие }Имеется два способа чтения из дескриптора: побайтное/посимвольное и построчное.
При побайтном/посимвольном чтении файла программа запрашивает у открытого дескриптора очередную порцию данных нужного размера и предоставляет скалярную переменную для запрошенных данных. Для чтения служит встроенная процедура read:
Perl
read $file , $buffer , 16 ;Можно представлять себе файл, открытый для чтения, как последовательность байтов. Воображаемый указатель отделяет уже прочитанную часть последовательности от ещё непрочитанной. Операция чтения приводит, помимо прочего, к сдвигу указателя к концу файла. За счёт этого следующая команда чтения получит доступ к новой порции данных. Дескриптор файла хранит в себе разнообразную информацию об открытом файле, и, в том числе, этот указатель - номер первого непрочитанного байта. Сразу после открытия указатель равен нулю.
Что же будет, если запросить при чтении больше байт, чем размер непрочитанной части файла? Ничего страшного, компьютер не сломается. Просто в переменную-буфер отправится меньше байт, чем было запрошено. Контролировать это явление удобно, пользуясь возвращаемым значением процедуры read - это количество байт, которое удалось прочесть. Широко распространена при программировании на Perl такая идиома:
Perl
while (read $file , $buffer , $size ) { сделать что-то с $buffer }Здесь значение, возвращённое из read , используется в качестве условия цикла. Рано или поздно файл будет прочитан до конца, и следующий вызов read возвратит ноль (ложное значение). Это прервёт цикл, что нам, собственно, и нужно.
В отличие от побайтного/посимвольного чтения, когда запрашивается заданное количество байтов или символов, при построчном чтении размер прочитанного заранее не оговаривается. Вместо этого считывается строка - последовательность байтов или символов вплоть до символа или символов, обозначающих конец строки.
Построчное чтение осуществляется оператором <…> . Код <$file > приводит к считыванию очередной строки из дескриптора $file в переменную по умолчанию $_ .
Для последовательной обработки всех строк файла удобно использовать цикл while . Например, программа, печатающая содержимое файла на экран, строка за строкой, могла бы выглядеть так:
Perl
open my $file , "<" , "file.txt" or die "Невозможно открыть файл: $!\n" ; while (<$file >) { print ; }Здесь читатель справедливо задаётся вопросом: что именно печатает процедура print в теле цикла? Переменную по умолчанию, конечно. Можно было бы написать print $_ , но вряд ли это добавит ясности.
Другой пример. В уже открытом файле записаны числа, по одному в строке. Требуется вывести на экран их сумму.
Perl
my $sum =0 ; while (<$file >) { chomp ; $sum +=$_ ; } print "$sum\n" ;Команда chomp необходима вот по какой причине. Оператор <…> вместе со строкой считывает и завершающий строку символ, который создаст проблему, если считанная строка впоследствии будет участвовать в арифметическом выражении. Встроенная процедура chomp удаляет этот символ, если строка заканчивается им. Если же последний символ другой, процедура ничего не делает. такая предосторожность нужна на тот случай, если, к несчастью, файл не заканчивается символом конца строки. Тогда и последняя прочитанная из файла строка закончится чем-то другим. Имеется также процедура chop , которая удаляет и возвращает последний символ строки независимо от того, какой он. Обе процедуры, chop и chomp , работают со строкой, переданной как параметр, но в отсутствие параметра - с переменной $_ .
Не следует думать, что с оператором построчного чтения мы обречены на использование переменной $_ . Если требуется читать в другую переменную, используем присваивание:
Perl
$s =<$file >;Самое время сообщить об одной особенности оператора построчного чтения. Его смысл немного меняется, если оператор поместить в списочный контекст, то есть туда, где должен быть список. Например, если присвоить массиву:
Perl
@s =<$file >;В этом случае все строки, прочитанный из файла, заполнят массив. Ещё можно организовать переборный цикл:
Perl
print for <$file >;Этот код, как и приведённый выше цикл while , печатает строки файла на экран. К тому же результату приведёт код
Perl
print <$file >;(здесь пропущено слово for ). Но мы не рекомендуем такой подход, поскольку здесь сначала прочитываются все строки из файла, а затем передаются как список параметров в процедуру print . При этом все строки без всякой необходимости занимают память, а при большом файле объём памяти может быть очень велик.
Вообще, построчное чтение может создать похожую проблему, если в файле имеются очень длинные строки. И хотя это не характерно для текстовых файлов (например, созданных в текстовом редакторе), следует принимать это обстоятельство во внимание.
При открытии файла для чтения предполагается, что файл существует, в противном случае открытие приводит к ошибке. Если файл открывается для записи, требовать существования файла уже не стоит: отсутствующий файл создаётся пустым. Если же файл существовал, всё его содержимое уничтожается, и мы снова получаем пустой файл.
Для записи в дескриптор применяется давно знакомая нам процедура print , но не совсем так, как мы привыкли:
Perl
print $file $string ;Здесь содержимое строки $string записывается в открытый дескриптор $file . Обратите особое внимание на отсутствие запятой после первого параметра $file . С запятой смысл команды будет другим: в дескриптор ничего не запишется, а вместо этого программа выведет на экран строковое представление значений обеих переменных $file и $string:
GLOB(0x989e830)Привет!
(шестнадцатеричное число в скобках, скорее всего, будет другим, ну и вместо слова Привет! может оказаться другой текст). Число это нам ни о чём не говорит, как и загадочное слово GLOB вместе со скобками. Итак, если все параметры процедуры print разделены запятыми, все они печатаются на экран. Если после первого параметра нет запятой, этот параметр должен быть дескриптором, открытым для записи, а остальные параметры записываются в него:
Perl
print $file "Hello, " , $user ;Можно все параметры после дескриптора заключить в скобки:
Perl
print $file ("Hello, " , $user );Один из видных специалистов по языку Perl рекомендует заключать дескриптор в фигурные скобки, чтобы зрительно отделить его от остальных параметров:
Perl
print {$file } "Hello, " , $user ;Программисты часто встречаются с ситуацией, когда требуется в шаблонный текст в определённых местах поместить изменяющиеся фрагменты. Perl хорошо приспособлен для решения таких задач. Изменяющиеся части текста очень удобно поместить в переменную, а имя переменной вставить в нужное место в строку, заключённую в двойные кавычки:
Perl
print "Уважаемый $name! Вы задолжали $duty рублей. Уплатите до $date, иначе $punishment.\n" ;Таким способом можно вставлять в шаблон и строки, и числа. Что касается чисел, в каких-то ситуациях может потребоваться их особое форматирование. Числа перед включением в шаблон может потребоваться округлить до нужного количества десятичных цифр после точки, дополнить слева нужным количеством нулей или пробелов, чтобы число хорошо смотрелось в таблице. Может потребоваться вставить число в двоичном или шестнадцатеричном формате.
В таких ситуациях на помощь приходят встроенные процедуры printf и sprintf . Первый параметр в обеих процедурах - так называемая форматная строка . Это шаблонный текст, в который с определённые места должны быть вставлены остальные параметры. Места вставки параметров и желательный формат специальным образом помечаются. Метка представляет собой знак процента, за которым следует обозначение формата. Остальные параметры процедуры вставляются на места форматных меток в соответствующем формате. Процедура printf выводит результат в дескриптор подобно процедуре print , а sprintf возвращает полученную после всех вставок строку для какого-то иного использования. В принципе, если бы не было printf , её можно было бы легко запрограммировать: вызов printf (…) равносилен print (sprintf (…)) .
Теперь подробнее о форматных строках и форматных метках.
Шестнадцатеричный формат с дополнением нулями до трёх цифр:
Использование знака процента как признака метки лишает нас возможности использовать его в форматной строке как таковой. Эта трудность не новая для нас, и разрешается она уже хорошо знакомым способом. Комбинация из двух знаков процента означает одиночный знак процента (подобно тому, как \\ внутри "" -строк означает один бэкслэш):
Perl
$p =38 ; $x =43 ; printf "%d%% от %d равно %d\n" , $p , $x , $p /100 *$x ;38% от 43 равно 16
Точно так же, как и print , процедура printf может осуществлять вывод не только на экран, но и дескриптор файла, открытого для записи или для добавления:
Perl
printf {$file } … ;Perl использует технику, называемую переменную дескриптор файла для работы тип файла.
Чтение или запись данных из файла требует использования дескрипторов файлов.
Ручка файла (дескриптор файла) является наименовании соединений ввода / вывода.
Perl предоставляет три файла ручками: STDIN, STDOUT, STDERR, представляющие стандартный ввод, стандартный вывод и стандартный вывод ошибок.
Perl файлы могут быть открыты в следующих способов:
Open FILEHANDLE, EXPR open FILEHANDLE sysopen FILEHANDLE, FILENAME, MODE, PERMS sysopen FILEHANDLE, FILENAME, MODE
Параметр Описание:
Мы используем следующую функцию кода, чтобы открыть режим только для чтения (<), чтобы открыть файл file.txt:
Open(DATA, " <Только для чтения
представление.
Код файла DATA Ручка используется для чтения файла, следующий пример будет открыть файл и содержимое файла на выходе: #!/usr/bin/perl
open(DATA, " Следующий код для записи (>) способ открыть файл file.txt: Open(DATA, ">file.txt") or die "file.txt 文件无法打开, $!";
> Для режима записи.
Если вам нужно открыть файл в режиме чтения-записи, перед> или <символ знак +, чтобы добавить: Open(DATA, "+ Такой подход не удаляет содержимое исходного файла, если вы хотите удалить следующий формат: Open DATA, "+>file.txt" or die "file.txt 文件无法打开, $!";
Если вы хотите подать дополнительные данные, дополнительные данные перед тем, вам нужно всего лишь открыть файл в режиме добавления: Open(DATA,">> >> Представляет добавлять данные в существующий файл, если вам нужно прочитать содержимое файла, чтобы добавить, чтобы добавить знак +: Open(DATA,"+>>file.txt") || die "file.txt 文件无法打开, $!";
В следующей таблице перечислены различные режимы доступа: ФункцияSysOpen аналогична открыть функцию, но они не являются такими же формой аргумента.
Следующий пример основан на чтение и запись (+ <имя файла) способ, чтобы открыть файл: Sysopen(DATA, "file.txt", O_RDWR);
Если вам необходимо обновить файлы, удаленные до того, как файл записывается следующим образом: Sysopen(DATA, "file.txt", O_RDWR|O_TRUNC);
Вы можете использовать O_CREAT, чтобы создать новый файл, O_WRONLY записи только режим, O_RDONLY режим только чтения. Параметры завивке восьмеричное значение свойства указывает на то, что права доступа к файлам после создания, по умолчанию0x666.
В следующей таблице перечислены возможные значения режима: После использования в файле, закройте файл, который вы хотите обновить входные и выходные буферы дескриптор файла, связанные с закрытием файла имеет следующий синтаксис: Close FILEHANDLE
close
FILEHANDLE для указанного дескриптора файла, если успешно закрыта возвращается верно. Close(DATA) || die "无法关闭文件";
Чтение и запись информации в файл Есть несколько различных способов: Основной метод чтения информации из открытого дескриптора файла является #!/usr/bin/perl
print "本教程网址?\n";
$name = После реализации описанной выше процедуры следующая информация, мы вводим вывод URL оператор печати: Когда мы используем Реализация создает import.txt файл, следующим образом: $ cat import.txt
1
2
3
#!/usr/bin/perl
open(DATA," xgetc функция возвращает один символ из указанного FILEHANDLE, если вы не указываете обратный STDIN: Getc FILEHANDLE
getc
В случае возникновения ошибки, или дескриптор файла в конце файла, то она возвращает ФДООН. Функция чтения используется для обработки информации, считанной из буфера файла. Эта функция используется для чтения двоичных данных из файла. Read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
Параметр Описание: В случае успешного возвращения, чтобы прочитать количество прочитанных байтов, возвращает 0, если конец файла, если произошла ошибка возврата UNDEF. Для вся информация считывается из функций дескриптор файла на заднем конце основной функции заключается в написании печати: Print FILEHANDLE LIST
print LIST
print
Используйте файл и функции печати может обрабатывать результаты выполнения к выходным устройствам (STDOUT: стандартный вывод), например: Print "Hello World!\n";
В следующем примере мы открываем существующий файл file1.txt, и читать его каждую строку записывается в файл file2.txt в: #!/usr/bin/perl
# 只读方式打开文件
open(DATA1, " Ниже приведены примеры, мы уже существующий файл file1.txt переименовать file2.txt, каталог, указанный в / USR / w3big / тест / в: #!/usr/bin/perl
rename ("/usr/w3big/test/file1.txt", "/usr/w3big/test/file2.txt");
Функцияпереименовывает принимает только два параметра, только файл уже существует, будет переименован.
Следующие примеры показывают, как мы используем функциюUNLINK , чтобы удалить этот файл:
#!/usr/bin/perl
unlink ("/usr/w3big/test/file1.txt");
Вы можете использовать функциюСКАЖИТЕ, чтобы получить местоположение файла, а также указать местоположение в файле с помощью функции искать:
Функция скажите используется для получения местоположения файла: Tell FILEHANDLE
tell
Если FILEHANDLE функция возвращает позицию указателя файла в байтах. Если вы не укажете возврат к умолчанию выбирается ручкой файла. искать () функция используется для перемещения через файл дескриптор файла читать и писать указатели путь для чтения или записи файла в байтах чтения и записи: Seek FILEHANDLE, POSITION, WHENCE
Параметр Описание: Seek DATA, 256, 0;
Perl файловые операции также может проверить, существует ли файл и читать и писать. Что я могу создать file1.txt файл, например, в следующем: $ cat file1.txt
www..txt";
my (@description, $size);
if (-e $file)
{
push @description, "是一个二进制文件" if (-B _);
push @description, "是一个socket(套接字)" if (-S _);
push @description, "是一个文本文件" if (-T _);
push @description, "是一个特殊块文件" if (-b _);
push @description, "是一个特殊字符文件" if (-c _);
push @description, "是一个目录" if (-d _);
push @description, "文件存在" if (-x _);
push @description, (($size = -s _)) ? "$size 字节" : "空";
print "$file 信息:", join(", ",@description),"\n";
}
Вышеприведенная программа, выход: File1.txt 信息:是一个文本文件, 15 字节
Файл операторы тестирования в следующей таблице: В 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(), причем результаты ее вычисления кэшируются, что позволяет использовать специальный файловый дескриптор _ для ускорения множественных проверок файла: If(-s("filename") && -T _) {
# Что-то делаем для текстовых файлов не нулевого размера. . . . . . . . . . . . . .
}
Изменение текущего рабочего каталога на каталог, определяемый значением параметра ВЫРАЖЕНИЕ. Если параметр опущен, домашний каталог становится текущим. Возвращает бклево значение Истина в случае успешного выполнения операции замены текущего каталога и Ложь в противном случае. Chdir [ВЫРАЖЕНИЕ]
Функция chmod() изменяет права доступа для файлов, представленных в списке, переданном ей в качестве параметра. Первым элементом этого списка должно быть трехзначное восьмеричное число, задающее права доступа для владельца, пользователей из группы, в которую входит владелец, и прочих пользователей. Каждая восьмеричная цифра определяет право на чтение файла, запись в файл и его выполнение (в случае если файл представляет выполняемую программу) для указанных выше групп пользователей. Установленные биты ее двоичного представления отражают соответствующие права доступа к файлу. Например, если установлены все три бита (восьмеричное число 7), то соответствующая группа пользователей обладает всеми перечисленными правами: может читать из файла, записывать в файл и выполнять его. Значение равное 6 определяет право на чтение и запись, 5 позволяет читать из файла, выполнять его, но не позволяет записывать в этот файл и т.д. Обычно не выполняемый файл создается с режимом доступа 0666 - все пользователи могут читать и записывать информацию в файл, выполняемый файл - с режимом 0777. Если владелец файла желает ограничить запись в файл пользователей не его группы, то следует выполнить следующий оператор: Chmod 0664, "file.dat";
Возвращаемым значением функции chmod(), как и функции chown(), является количество файлов из списка, для которых операция изменения прав доступа завершилась успешно. В операционных системах DOS и Windows имеет значение только установка режимов доступа владельца. Любой пользователь, создавший собственный файл, считается его владельцем. Изменить владельца файла из сценария Perl можно функцией chown(). Параметром этой функции является список, первые два элемента которого должны представлять числовые идентификаторы uid и gid. Остальные элементы списка являются именами файлов, для которых изменяется владелец. Эта функция возвращает количество файлов, для которых операция изменения владельца и группы прошла успешно. Пример:
@list = (234, 3, "file1.dat", "file2.dat");
$number = chown(@list);
warn "Изменился владелец не у всех файлов!" if $number != @list-2;
Изменить владельца файла может только сам владелец или суперпользователь (обычно системный администратор) системы UNIX. В операционных системах с файловой системой отличной от UNIX (DOS, Windows) эта функция отрабатывает, но ее установки не влияют на доступ к файлу. Определяет новый корневой каталог для всех относительных (начинающихся с косой черты "/") имен файлов процесса пользователя и порожденных им процессов. Не меняет текущий рабочий каталог. В отсутствии параметра используется значение специальной переменной $_. Может вызываться только суперпользователем. Chroot ИМЯ_КАТАЛОГА
По завершению работы с файлом он закрывается функцией close(). Единственным необязательным параметром этой функции является дескриптор, ассоциированный с файлом. Эта функция возвращает значение Истина, если успешно очищен буфер ввода/вывода и закрыт системный дескриптор файла.
Вызванная без параметра, функция close закрывает файл, связанный с текущим дескриптором, установленным функцией select(). При возникновении ошибок закрытия файла их можно обнаружить применяя специальную переменную $!:
close (FILE) or die "Ошибка закрытия файла: $!"; Закрывает каталог, ассоциированный с дескриптором каталога, заданным параметром ДЕСКРИПТОР. Возвращает булево значение Истина, если каталог успешно закрыт. Closedir ДЕСКРИПТОР
Реализует системную команду Unix fcntl(2). Перед использованием следует получить доступ к определениям системных констант оператором use Fcntl. Возвращаемое значение: если системная функция возвращает -1, то функция Perl - неопределенное значение; если системная функция возвращает 0, то функция Perl строку "0 but true"; если системная функция возвращает какое-либо другое значение, функция Perl возвращает это же значение. Fcntl ДЕСКРИПТОР, ФУНКЦИЯ, СКАЛЯР
Возвращает найденные в текущем каталоге файлы, имена которых удовлетворяют заданному шаблону (с использованием метасимволов Unix "*","?"). Значением выражения должна быть строка, содержащая шаблон имен файлов. Glob ВЫРАЖЕНИЕ
Реализует системную команду Unix ioctl(2). Перед использованием следует получить доступ к определениям системных констант оператором require "ioctl.ph"; Возвращаемое значение: Link СТАРЫЙ, НОВЫЙ
Возвращает список значений полей структуры индекснего дескриптора символической ссылки на файл. Если параметр опущен, то используется значение специальной переменной $_. Lstat [ДЕСКРИПТОР]
lstat [ВЫРАЖЕНИЕ]
Используется для получения информации о символических ссылках. Возвращает список значений полей структуры индексного дескриптора самой ссылки, а не файла, на который она ссылается. Эта функция работает аналогично функции stat(). Создание нового каталога с именем, заданным в параметре КАТАЛОГ, и режимом доступа, определяемым параметром РЕЖИМ. При успешном создании каталога возвращает булево значение Истина, в противном случае Ложь и в переменную $! заносится сообщение об ошибке. Mkdir КАТАЛОГ, РЕЖИМ
Для доступа к файлу из программы Perl необходим дескриптор. Для создания дескриптора используется функция open(). При выполнении операции open с заданым в параметрах именем файла открывается соответствующий файл и создается дескриптор этого файла. В качестве дескриптора файла можно использовать выражение - его значение и будет именем дескриптора. Имя файла задается непосредственно в виде строкового литерала или выражения, значением которого является строка. Операция open без имени файла открывает файл, имя которого содержится в скалярной переменной $ДЕСКРИПТОР, которая не может быть лексической переменной, определенной функцией my(). Пример:
#! perl -w
$var = "out.dat";
$FILE4 = "file4.dat";
open FILE1, "in.dat"; # Имя файла задано строкой
open FILE2, $var; # Имя файла задано
переменной
open FILE3, "/perlourbook/01/".$var; # Имя файла вычисляется
в выражении
open FILE4; # Имя файла в
переменной $FILE4
Если задано не полное имя файла, то открывается файл с указанным именем и расположенный в том же каталоге, что и программа Perl. Можно задавать полное имя файла, однако следует иметь в виду, что оно зависит от используемой операйионной системы. Например, в Windows следует обязательно задавать имя диска: d:/perlbook/file1.doc Любой файл можно открыть в одном из следующих режимов: чтения, записи или добавления в конец файла. Это осуществляется присоединением соответствующего префикса к имени файла: Если префикс опущен, то по умолчанию файл открывается в режиме чтения. Запись информации в файл, открытый в режиме записи, осуществляется в начало файла, что приводит к уничтожению содержащейся в нем до его открытия информации. Информация, содержащаяся в файле, открытом в режиме добавления, не уничтожается, новые записи добавляются в конец файла. Если при открытии файла в режиме записи или добавления не существует файла с указанным именем, то он создается, что оличает эти режимы открытия файла от режима чтения, при котором файл должен существовать. В противном случае операция открытия завершается с ошибкой и соответствующий дескриптор не создается. Perl позволяет открыть файл еще в одном режиме - режиме чтения/записи. Для этого перед префиксом чтения <, записи > или добавления >> следует поставить знак +. Открытие каталога, имя которого равно значению параметра ВЫРАЖЕНИЕ, и связывает его с дескриптором, определяемым параметром ДЕСКРИПТОР. Имена дескрипторов каталогов хранаятся в собственном пространстве имен таблицы имен Perl. Opendir ДЕСКРИПТОР, ВЫРАЖЕНИЕ
Возвращает значение сиволической ссылки, определяемой параметром ВЫРАЖЕНИЕ, если символические ссылки реализуются операционной системой; в противном случае - фатальная ошибка. Если при получении значения символической ссылки были получены системные ошибки, возвращает неопределенное значение и в специальную переменную $! заносится сообщение об ошибке. Если параметр опущен, используется значение переменной $_. Readlink [ВЫРАЖЕНИЕ]
Переименовывает файл. Возвращает 1 в случае успешного переименования и 0 в противном случае. Rename СТАРОЕ_ИМЯ, НОВОЕ_ИМЯ
В файловой структуре UNIX информация о файле храниться в его индексном дескрипторе (inode). Структура индексного дескриптора состоит из 13 полей, для которых используются специальные обозначения: Не все перечисленные поля структуры индексного дескриптора поддерживаются всеми файловыми системами. Функция stat() предназначена для получения значений полей структуры индексного дескриптора файла. Ее единственным параметорм может быть либо имя файла, либо дескриптор открытого в программе файла. Она возвращает список из 13 элементов, содержащих значения полей структуры индексного дескриптора файла в том порядке, как они перечислены в таблице. Типичное использование в программе Perl представлено ниже:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);
Присваивание значение полей списку скалярных переменных с идентификаторами, соответствующими названиям полей, способствует лучшей читаемости программы, чем присваивание массиву скаляров:
@inode = stat($filename);
В последнем случае получить значение соответствующего поля можно только с помощью индекса, что не совсем удобно, так как нужно помнить номер нужного поля структуры. Если при обращении к функции stat() не указан параметр, то она возвращает структуру индексного дескриптора файла, чье имя содержится в специальной переменной $_. Функция получения информации о файле при успешном выполнении в списковом контексте возвращает список значений полей структуры индексного дескриптора файла или пустой список в случае неудачного завершения. В скалярном контексте она возвращает булево значение Истина или Ложь в зависимости от результатов своего выполнения. Для удобства использования информации о файле функция stat() при успешном выполнении кэширует полученные значения полей. Если вызвать эту функцию со специальным дескриптором файла _ (символ подчеркивания), то она возвратит информацию, хранящуюся в кэше от предыдущего ее вызова. Это позволяет проверять различные атрибуты файла без повторного вызова функции stat() или сохранения результатов ее выполнения в переменных программы. Функцию stat() можно использовать для получения структуры индексного дескриптора не только файла, но и жестких ссылок на него, а также каталогов, так как они являются также файлами, блоки данных которых содержат имена файлов каталога и их числовых индексных дескрипторов. Symlink СТАРОЕ_ИМЯ, НОВОЕ_ИМЯ
Устанавливает маску режима доступа процесса, заданную значением параметра ВЫРАЖЕНИЕ (восьмеричное число), и возвращает предыдущее значение маски режима доступа. Umask ВЫРАЖЕНИЕ
Удаление файлов, определенных параметром СПИСОК. Возвращает количество успешно удаленных файлов. Unlink СПИСОК
В структуре индексного дескриптора файла существует три поля, в которых храниться время последнего обращения (atime) к файлу, его изменения (mtime) файла и изменения индексного дескриптора (ctime). Функцией utime() можно изменить время последнего обращения и модификации файла. Ее параметром является список, содержащий имена обрабатываемых файлов, причем первые два элемента списка - числовые значения нового времени последнего доступа и модификации:
@files = ("file1.dat", "file2.dat");
$now = time;
utime $now, $now, @files;
В этом фрагменте кода время последнего доступа и модификации файлов из списка @files изменяется на текущее время, полученное с помощью функции time. Отметим, что при выполнении функции utime() изменяется и время последней модификации индексного дескриптора (ctime) - оно устанавливается равным текущему времени. Возвращаемым значением является количество файлов, для которых операция изменения времени последнего доступа и модификации прошла успешно. Главная страница » PERL » Циклы и ветвления.
Файловый ввод и вывод.
режим
описание
<Или г
> Или ж
>> Или
Открыть для записи указатель файла в конец файла. Если файл не существует, делается попытка создать.
+ <Или г +
+> Или ш +
Открыть для чтения и записи, указатель файла в заголовок файла и размер файла обрезается до нуля. Если файл не существует, делается попытка создать.
>> + Или +
Открыть для чтения и записи указатель файла в конец файла. Если файл не существует, делается попытка создать.
функция SysOpen
режим
описание
O_RDWR
Открыть для чтения и записи, указатель файла в заголовке файла.
O_RDONLY
Открыть только для чтения указатель файла в заголовке файла.
O_WRONLY
Открыть для записи указатель файла в заголовке файла и размер файла обрезается до нуля. Если файл не существует, делается попытка создать.
O_CREAT
Создайте файл
O_APPEND
Append File
O_TRUNC
Размер файла режется до нуля
O_EXCL
Если вы используете O_CREAT файл существует, он возвращает сообщение об ошибке, он может проверить, существует ли файл
O_NONBLOCK
Неблокирующая операций ввода / вывода, так что мы либо успеха или немедленно возвращает ошибку, не блокирован.
Закрыть функция
Чтение и запись файлов
оператор
функция ЕОКП
функция чтения
функция печати
копирование файлов
Переименовать файл
Удалить файлы
Укажите расположение файла
скажите функцию
искать функцию
информация о файле
операторы
описание
-А
Файл первого обращения времени (единицы: дней)
-B
Является ли это двоичный файл
-С
Файл (индексных дескрипторов) инод время модификации (единицы измерения: дней)
-М
Файл последнего изменения времени (единицы измерения: дней)
-О
Все файлы являются реальными UID
-R
Файл или каталог может быть прочитан реальным UID / GID
-S
Сокет (Socket)
-T
Является ли это текстовый файл
-W
Файл или каталог может быть записан в режиме реального UID / GID
-X
Файлы или каталоги могут быть выполнены в режиме реального UID / GID
-b
Файл блок-специальное (специальный блок) (например, монтирования диска)
-с
Символ-специальное (специальные символы) файл (например, устройства ввода / вывода)
-d
каталог
-е
Имя файла или каталога существует
-f
Обычный файл
-g
Файл или каталог имеет атрибут setgid
-k
Файл или каталог имеет липкий бит
-l
Это является символической ссылкой
-о
Все файлы доступны UID
-p
Файл является именованным каналом (FIFO)
-r
Файлы могут быть эффективно UID / GID чтения
-s
Файл или каталог существует и не 0 (возвращает число байт)
-t
Ручка Файл TTY (функция isatty система () возвращает результат, имя файла не может использовать этот тест)
-u
Файл или каталог имеет атрибут Setuid
-w
Файлы могут быть записаны в действительный UID / GID
-x
Файлы могут быть выполнены эффективно UID / GID
-z
Файл существует, размер 0 (константа каталога ложно), то есть, пуст ли файл,
chdir
chmod
chmod СПИСОК
chown
chown СПИСОК
chroot
close
close ДЕСКРИПТОР
closedir
fcntl
glob
ioctl
fcntl ДЕСКРИПТОР, ФУНКЦИЯ, СКАЛЯР
link
lstat
mkdir
open
open ДЕСКРИПТОР, ИМЯ_ФАЙЛА;
open ДЕСКРИПТОР;
opendir
readlink
rename
stat
Поле
Описание
dev
Номер устройства в файловой системе
ino
Номер индексного дескриптора
mode
Режим файла (тип и права доступа)
nlink
Количество жестких ссылок на файл (в отсутствии ссылок равно 1)
uid
Числовой идентификатор владельца файла
gid
Числовой идентификатор группы владельца файла
rdev
Идентификатор устройства (только для специальных файлов)
size
Размер файла в байтах
atime
Время последнего обращения к файлу с начала эпохи
mtime
Время последнего изменения файла с начала эпохи
ctime
Время изменения индексного дескриптора с начала эпохи
blksize
Предпочтительный размер блока для операций ввода/вывода
blocks
Фактическое количество выделенных блоков для размещения файла
symlink
umask
unlink
utime
utime СПИСОК