Создание серверных приложений на языке PERL

         

Урок 14. Функции для работы


Урок 14. Функции для работы с файлами (продолжение)

Оператор "-X"





Проверка файла, где 'X' - одно из ниже описанных значений. Это унарный оператор с одним аргументом - либо именем файла, либо указателем файла. Проверяет одно из условий. Если аргумент не указан, то берется значение переменной $_. Несмотря на странный вид, это унарный оператор с соответствующим приоритетом. Аргумент можно заключать в круглые скобки. 'X' имеет следующие значения:
-r Файл разрешен на чтение эффективным uid/gid
-w на запись -//-
-x исполнение -//-
-o принадлежит эффективному uid (идентификатор пользователя)
-R Файл разрешен на чтение реальным uid/gid
-W на запись -//-
-X исполнение -//-
-O принадлежит реальному uid
-e файл существует
-z пустой
-s не пустой
-f обычный текст
-d директория
-l символическая ссылка
-p pipes (конвейер)
-S socket (гнездо)
-b специальное блочное устройство
-c -//- символьное -//-
-t указатель на уст-во tty
-u установлен бит setuid
-g -//- setgid
-k -//- sticky
-T текстовой файл
-B двоичный
-M "возраст" файла в днях на момент старта скрипта
-A дней с последнего чтения
-C дней с последней модификации inode
Если проверяется условие, то возвращает True при истинном утверждении и False при ложном. Код ниже проверяет наличие файла "file.txt" в текущей директории и при его наличие выводит кол-во дней с момента последнего обращения к нему:

if (-e("file.txt")){print (-A("file.txt"))} else {print "Файл не создан"}

Функция Read



read (FileVar, скаляр, длина, смещение);

read (FileVar, скаляр, длина);


Прочитать указанное число байт из файла в скалярную переменную. Возвращает количество прочитанных байт или неопределенность при ошибке. Длина скаляра станет равной количеству считанных байт. Смещение указывают, если данные нужно поместить не с самого начала строки. Положение указателя сохраняется.



Код ниже читает и выводит 15 байт из файла "file.txt":

open (file,"file.txt"); read("file",$u,5); print $u,"<BR>"; read("file",$u,10); print $u; close file;

Функция Getc



getc (FileVar);


Читает и возвращает символ из указанного файла. Если файл не указан, то читается STDIN. После конца файла возвращает пустую строку.

Код ниже читает и выводит 15 байт из файла "file.txt":

open (file,"file.txt"); while ($u<=15){ print getc(file); } continue{$u++} close file;

Функция Rename

rename (старое_имя, новое_имя_файла);

Переименовать файл. Возвращает 1 в случае успеха, иначе - 0.

Функция Unlink

unlink (список)

Удаляет файлы, указанные в списке. Возвращает количество удаленных файлов.

* * * *

Напишем программу, которая создает, переименовывает и удаляет файл delete.me:

#!/usr/bin/perl # programm 14 print "Content-type: text/html\n\n";

unless (-e("delete.me") or -e("undelete")){ open (file,">delete.me") or print "Невозможно создать файл<br>"; close file; rename ("delete.me","undelete") and print "Удачно переименован<br>"; unlink ("undelete") and print "Удачно удален"; } else { print" Невозможно произвести операцию!" }

Я чувствую, что привел Вас в замешательство. Действительно, операторы AND и OR использованы здесь не совсем в "традиционном" контексте.

Вы знаете, чтобы оператор OR вернул истину, необходимо чтобы хотя бы ОДИН из операндов имел значение ИСТИНА. Чего не скажешь об операторе AND. Для того чтобы он вернул истину, необходимо чтобы ОБА операнда являлись истинными. От сюда следует, что если первый операнд возвращает ИСТИНУ, то оператору OR совершенно не обязательно выполнять второе выражение чтобы чтобы ему самому стать истинным. Аналогично с оператором AND. Если первое выражение возвращает ложь, то второе выполнять не обязательно, т.к. независимо от его значения, AND всё равно вернет ЛОЖЬ.



Разберем работу AND и OR на примере программы 14.

С IF (unless) всё прозрачно;

Функция Open, как известно, возвращает False в случае неудачного открытия файла и ничего не возвращает в случае удачи. Значит если Open вернет False, оператор OR будет вынужден проверить: "а не является второе выражение True?!" и выполнит вывод строки на экран браузера.

Оператор Rename возвращает кол-во переименованных файлов. Значит, если ему не удастся переименовать 1 файл, он вернет 0, т.е. False.

В нашем случае если Rename вернет 1, т.е. True, оператор AND должен будет проверить на истинность второе выражение и выполнит вывод на экран браузера. Если же Reneme вернет False, второе выражение выполнено не будет.

* * * *

Напишите программу, которая проверяет наличие файла index.htm в директории с HTML файлами и при его наличие выдает его браузеру. Т.е. Вам нужно его полностью считать и распечатать.

Попробуйте использовать разные способы считывания файла (посимвольный и построчный) в зависимости от передаваемого скрипту параметра.

[Содержание]  [Вступление]  [необходимое для начала изучения]  [урок 1]  [урок 2]  [урок 3]  [урок 4]  [урок 5]  [урок 6]  [урок 7]  [урок 8]  [урок 9]  [урок 10]  [урок 11]  [урок 12]  [урок 13]  [урок 14]  [урок 15]  [урок 16]  [урок 17]  [урок 18]  [урок 19]  [урок 20]  [урок 21]  [урок 22]  [урок 23]  [урок 24]  [урок 25]  [урок 26]  [урок 27]  [урок 28]  [правила хорошего тона]  [приложение A]  [приложение Б]  [приложение В]  [заключение]  [благодарности] 



Copyright (c) ClericICN, 2002

Содержание раздела