Анимация
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Второй аргумент данной функции - это список каталогов, по которым проводится поиск. А первый аргумент - новый для вас; это ссылка на подпрограмму. Сс1лка на подпрограмму создается точно так же, как и ссылка на скаляр или массив: это просто имя подпрограммы, перед которым стоит обратная косая черта. Чтобы сделать ссьшку на подпрограмму, перед ее именем вы должны поставить символ Подпрограмма, имя которой указано в качестве первого параметра в функции find, будет вызываться для каждого файла и каталога из списка dirlist.

В листинге 14.1 приведена программа поиска пропавшего файла

Поиск фа

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

!/usr/bin/perl -w

use strict; use File::Find;

sub wanted {

if ($ eg

find \iwanted, /documentsl

"important.doc") { print $File::Find::name;

Проведем анализ программы.

Строка 2. С этих двух строк начинается практически любая программа на Perl Ключ -w активизирует режим вывода предупреждений, а оператор use strict используется для ужесточения контроля интерпретатора Perl над ошибками в программе и выявления плохого стиля программирования.

Строка 3. К вашей программе подключается модуль File::Find. В результате становится доступной функция find.

Строка 5. Эта функция вызывается для каждого файла и каждого подкаталога, находящихся в каталоге /documents. Например, если в этом каталоге содержится 100 файлов и 12 подкаталогов, то подпрограмма wanted будет вызываться раз.

Строка 6. Когда вызывается функции ted (), переменная $File: :Find: :name будет содержать полный путь к текущему обрабатываемому файлу, а переменная $ - только имя файла. В этой строке определяется, является ли искомым именем файла important.doc; и если да, то печатается

полный путь к этому файлу.

Строка 10. При вызове функции find ей передается ссылка на подпрограмму Uwanted и имя каталога, в котором производится поиск файла. Функция wanted () вызывается для каждого файла и каталога, содержащихся в /documents.

Для функции, вызываемое nd, будут доступны следующие переменные.

• $File;: Find:: name - полный путь к текущему файлу (каталог и имя файла);

• $File: :Find: :dir - имя текущего каталога;



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

В листинге приведен еще один пример использования модуля В

этом примере удаляются все файлы с расширением .tmp с устройств С: и D:. Эти временные файлы имеют свойство накапливаться и "съедать" свободное пространство жесткого диска. Данную программу можно легко адаптировать для удаления файлов на компьютере, на котором установлена система UNIX, или для выполнения любгх

других функций по обслуживанию файловой системы.

1сти.2. удален времек фаов

1: ll/usr/bin/perl -w 2: use strict; 3: use Eil::Ein; 4:

5: siibwanbed {

6: t Проверни, что зю: т/мя. айта ттл каташга

7: if { -f $File::Find!!name ) {

8: f В Ц/Ш. к зйц/ допнта йпь стрска ".tmp"

9: if { $File::Find::nane=-/\.tap$/i) {

10: pecint "teiH3RE SFile::Find::name";

11: unlitk $Eil::Ein::;

12: }

13: }

14: }

15: fina(\Svanbaa, c:/, d: /) •

Программа, приведенная в листинге 14.2, в основном аналогична программе из листинга 14.1. Проведем анализ ее отличий.

Строка 7. Проводится проверка файла, имя которого передано подпрограмме wanted, для выяснения, обычный ли это файл или каталог. Как вы помните, данная подпрограмма вызывается и для файлов, и для каталогов.

Строки Проводится проверка имени файла для выяснения того, со-

держится ли в конце его расширение .tmp. И если да, то данный файл удаляется с помощью команды unlink.

Копирование файлов

Еще одну распространенную задачу - копирование файлов - можно выполнить в Perl довольно сложным путем.

1. Откройте исходный файл для чтения.

2. Откройте выходной файл для записи.

3. Прочитайте исходный файл и выполните запись его содержимого в в1ход-ной файл.

4. Закройте оба файла.



И, конечно, после каждого шага вы должны убедиться в том, чт каких ошибок не произопшо и что каждая операция записи была выполнена успешно, А теперь позвольте мне показать вам более простой способ. В Perl предусмотрен модуль File::Сору, осуществляющий копирование файлов. Ниже приведен пример использования этого модуля.

use File::Сору;

сору("sourcefile", "destination")

warn "Ошйка при копировании файлов: $1";

Этот фрагмент кода копирует содержимое исходного файл ef ile в выходной файл destination. Функция сору возвращает значение 1 в случае успешного завершения операции и О, если возникла какая-то проблема. При этом переменной SI присваивается текст соответствующего сообщения об ошибке.

В модуле File::Copy предусмотрена также функции ve. Путем простого изменения структуры элементов каталога файловой системы функция move пытается выпол-нйть операцию перемещения файлов без физического переноса их содержимого. Если исходный и выходной файлы расположены в одном каталоге и имеют разные имена, выполняется обычная операция переименования файлов. Обычно функция more так работает в случае, когда оба файла находятся в одной файловой системе или на одном диске. Если же по какой-либо причине выполнить быструю операцию перемещения

файлов не удается, функция move сначала копирует исходный файл в выходной, а затем удаляет первоначальный файл. Рассмотрим следующий пример:

use File::Сору;

if (notmoveCimportant.doc", "d:/archives/documents/important.doc"}) {

дат "Ctofe ip>i ПЕРЕМЕЩЕНА файла 1лрогЬшЬ.( Si"-, unldrk "dr/archives/documents/iniportant.doc";

Данный фрагмент кода перемешает файл important.doc из его текущего каталога в каталог Если при выполнении функции move произошел сбой,

то в выходном каталоге возможно появление частично скопированного файла

important.doc. В случае неудачного завершения операции move функция unlink удаляет

частично скопированный файл из выходного каталога.

Ау! Есть здесь кто-нибудь?

Модули Perl не ограничиваются только выполнением операций над файлами и каталогами. Например, модуль Net:;Ping можно использовать для определения того, может ли компьютер нормально взаимодействовать с другим узлом сети.

Имя модуля Net: :Ping происходит от утилиты ping системы UNIX. Эта утилита получила свое имя от слова "ping", обозначающего акустический импульсный сигнал, который используется на подводных лодках для обнаружения объектов по принципу отражения звука. Утилита ping посылает некоторый пакет другому компьютеру в сети. Если этот компьютер включен и нормально функционирует, то он посылает ответе и команда ping сообщает об успешном выполнении операции. Модуль Net::Ping, пример использования которого приведен ниже, работает аналогично.

if ( pingecho{"www.yahoo.com", 15) ) {

print "Сервер Yahco фущкцснир/ег нср1увльнэ."; } else {

print "C Yahoo чт произошло..



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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122