Анимация
JavaScript


Главная  Библионтека 

0 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [ 46 ] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

к сообщению, выдаваемому в случае "смерти" (оно строится на основе аргумента функции die) автоматически присоединяется имя Perl-программы и номер строки, поэтому вы можете легко определить, какая именно функция die несет ответственность за преждевременный выход из программы. Если же вы не хотите указывать номер строки или имя файла, поставьте в конец "предсмертного" текста символ новой строки. Например;

die "you gravy-sucking pigs";

ВЫВОДИТ файл и номер строки, а

die "you gravy-sucking pigs\n";

не выводит.

Еще одна удобная щтука внутри die-строк - переменная $!, которая содержит строку с описанием самой последней ощибки операционной системы. Используется она так:

open(LOG,">>logflie") I I die "cannot append: $!";

Например, в результате может быть выдано сообщение " cannot append: Permission denied".

Имеется также функция "вызова при закрытии", которую большинство пользователей знают как warn. Она делает все, что делает die, только "не умирает". Используйте ее для выдачи сообщений об ошибках на стандартный вывод:

open(LOG,">>log") warn "discarding logfile output\n";

Использование дескрипторов файлов

После того как дескриптор файла открыт для чтения, из него можно читать строки точно так же, как со стандартного ввода stdin. Например, для чтения строк из файла паролей используется такой код:

open (ЕР,"/etc/passwd"); while (<ЕР>) ( chomp;

print "I saw $ in the password file\n";

Обратите внимание: вновь открытый дескриптор помещен в угловые скобки, аналогично тому как ранее мы использовали stdin.

Если вы открыли дескриптор файла для записи или добавления и хотите ввести в него что-либо (с помощью функции print), этот дескриптор нужно



поставить сразу за ключевым словом print, перед остальными аргументами. Запятой между дескриптором и остальными аргументами быть не должно:

print LOGFILE "Finished item $n of $max\n";

print STDOUT "hi, world\n"; # как print "hi, world\n"

В этом случае сообщение, начинающееся со слова Finished, посылается в дескриптор файла logfile, который, предположительно, был открыт в программе ранее. Сообщение hi, world направляется на стандартный вывод, как и раньще, когда вы не указывали дескриптор. Мы говорим, что stdout - это дескриптор файла по умолчанию для оператора print.

Предлагаем вам способ копирования данных из файла, заданного в переменной $а, в файл, указанный в переменной $Ь. Он иллюстрирует почти все, о чем мы рассказывали на последних нескольких страницах:*

open(IN,$а) die "cannot open $а for reading: $"; open(OUT,">$b") II die "cannot create $b: $"; while (<IN>) ( # прочитать строку из файла $а в

print OUT $ ; # вывести эту строку в файл $Ь

close(IN) I I die "cant close $a: $"; close(OUT) II die "cant close $b: $";

Операции для проверки файлов

Теперь вы знаете, как открыть дескриптор файла для вывода, уничтожив суцдествующий файл с таким же именем. Предположим, вы хотите удостовериться, что файла с таким именем не существует (чтобы избежать случайного уничтожения своей электронной таблицы или очень важного календаря дней рождений). Если бы вы писали сценарий shell, вы использовали бы для проверки существования файла нечто вроде -е имя файла. Аналогичным образом в Perl применяется операция -е $filevar, которая проверяет факт существования файла, заданного в скалярной переменной $filevar. Если этот файл существует, результат - "истина"; в противном случае операция дает "ложь"**. Например:

$name = "index.html"; if (-е $name) {

print "I see you already have a file named $name\n"; } else (

print "Perhaps youd like to make a file called $name\n";

* Хотя при наличии модуля File: :Сору этот способ оказывается лишним

** Это не совсем хорошо, если вы работаете с lock-файлами или если файлы часто появляются и исчезают В этом случае вам нужно обратиты:я к функциям sysopen и flock, которые описаны в книге Programming Perl, или изучить примеры, приведенные в главе 19



Операнд операции -е - любое скалярное выражение, вычисление которого дает некоторую строку, включая строковый литерал. Вот пример, в котором проверяется наличие файлов index.html и index.cgi в текущем каталоге:

if (-е "index.html" -е "index.cgi") {

print "You have both styles of index files here.Xn";

Существуют и другие операции. Например, -г $filevar возвращает значение "истина", если заданный в $filevar файл существует и может быть прочитан. Операция -w $filevar проверяет возможность записи в файл. В следующем примере файл с заданным пользователем именем проверяется на возможность чтения и записи:

print "where? "; $filename = <STDIN>;

chomp $ filename; # выбросить этот надоедливый символ новой строки if (-Г $filename &4 -w $filename) {

# файл существует, я могу читать его и записывать в него

Есть много других операций для проверки файлов. Полный перечень т приведен в таблице 10.1.

Таблица 10.1 Операции для проверки файлов и их описание

Обозначение

Описание

Файл или каталог доступен для чтения

Файл или каталог доступен для записи

Файл или каталог доступен для выполнения

Файл или каталог принадлежит владельцу

Файл или каталог доступен для чтения реальным пользователем, но не "эффективным" пользователем (отличается от -г для программ с установленным битом смены идентификатора пользователя)

Файл или каталог доступен для записи реальным пользователем, но не "эффективным" пользователем (отличается от -W для профамм с установленным битом смены идентификатора пользователя)

Файл или каталог доступен для выполнения реальным пользователем, но не "эффективным" пользователем (отличается от -X для программ с установленным битом смены идентификатора пользователя)

Файл или каталог принадлежит реальному пользователю, но не "эффективному"пользователю (отличается от -о для программ с установленным битом смены идентификатора пользователя)

Изучаем PERL



0 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [ 46 ] 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103