Анимация
JavaScript
|
Главная Библионтека • Работа с диском и структурой каталогов. • Использование системных служб, например отправка электронной почты. В качестве примера рассмотрим программу, с помощью которой можно легко определить количество свободного дискового пространства в системе. Она будет полезна в случае, если один из пользователей захочет загрузить из Internet какой-либо файл и перед загрузкой проверить, поместится ли он на локальном диске. Фрагмент программы на Perl, оценивающий в системе Windows количество свободного дискового пространства для устройства, на котором находится текущий каталог, выглядит так: * В последней строке сообщения команд! dir должно находиться нечто I наподобие: 10 dir(s) 67,502,080 bytes free I В системе Windows 98 вместо слова bytes может выводиться MB iny(edir,Sfree); *dir=~dir"f $free=$dlr[$»dir]; $free=-s/.*{[\d,]+) \w+ fr€e/$l/; $free="s/, g; В этом фрагменте кода выбирается последняя строка листинга, полученного с помощью команды dir и помещенного в массив @dir. Далее с помощью регулярных выражений из этой строки выделяются числа и запятые, расположенные перед фразой bytes free. И, наконец, с помощью еше одного регулярного выражения из числа удаляются запятые, которые служат в качестве разделителей тысяч. В результате в переменной $free будет находиться размер свободного места на диске в байтах. Рассмотренный нами пример прекрасно работает в системе Windows. Для UNIX следует воспользоваться таким фрагментом программы: t В послецних строках сообщения ксмвп: -к t доляно находиться нечто наподобие: f Filesystem iK-blocks Used Avail Capacity Mounted on i /dev/wdOsla 31775 21431 7802 73% / ) таким образом, количество свободных блоков по 1024 байта t будет находагься в четвертом поле слева. I Подобный формат н>1вода принят в систауЕК linux и bed my(edir,?free); §dir="df -к .; ?free=(split{/\s+/, $dir[$*dir]))[3 ]; §free*=1024; Обратите внимание на отличие этого фрагмента кода от предыдущего. Для определения объема свободного пространства жесткого диска в системе Windows использовалась команда dir, а в UNIX - команда df -к Последняя строка, выводимая командой df -к ., разбивается на части, после чего извлекается содержимое четвертого (по счету) поля и присваивается переменной $free. Однако следует учитывать тот факт, что в различных системах UNIX выводимые командой df данные имеют разный формат (отличается количество полей) или поля расположены в другом порядке. Поэтому, если вы столкнетесь с такой проблемой, внесите необходимые коррективы в программу на Perl. Итак, мы создали две программы для двух операционных систем Windows и UNIX, выполняющих одни и те же действия, - определение объема свободного пространства на диске. Теперь давайте объединим их в одну универсальную программу, которая будет работать и в Windows, и в UNIX. 1 И. углубл E Perl if ($*Oeq MSWin32) { t В последЕКЙ сярсже сххэ&цения кшавдЕл dir допшо наждаться нечто I наподобие: 10 dir(s) 67,502,080 bytes free # В сзстеьЕ Windows 98 вместо стова bytes мснет вывсдиться MB my(§dir,Sfree); idir=~dir; Sfree=$dir[S*dir]; ?free=~s/.Ml\d,] + ) \w+free/$l/; $free="s/, g; ($*0 e ux) { If В последних строках сообния ксма df -k t должно находься нечто наподобие: » Filesystem IK-blocks Used Avail edacity Mounted en t /dev/wdOsla 31775 21431 7802 73% / t Таким оо, количество свободных блоков по 1024 ба t будет находься в чертом поле слева. t Подобный формат вывода ннят в сиэмах linux и bsd n{i!di,$free); edir=-df -к Sfree=(split(/\s+/, $dir[Sldir]))[3]; $free*=1024; } else { warn "Веизвеный тип операционной сизмыХп"; Теперь наша универсальная программа включает версии для DOS/Windows и Linux. Если кто-то попытается запустить ее в другой операционной системе, будет выведено соответствующее предупреждение и программа корректно завершит свою работу. Теперь практически вся работа по написанию переносимой программы завершена. Осталось только оформить ее в виде подпрограммы. Тогда все ее внутренние переменные будут локальными, и при необходимости любой программист сможет легко воспользоваться созданной вами подпрограммой. subfreeaae { •my(gdir,Sfree); if ($-oeq Ч!(Шш32) { * Впх1ВДИ1СяраЕаооа1Э31;ишувццЕл dir даже шядапься шчго • нащцэ&Е: 10 dir(s) 67,502,080 tydes free # В СТЕГЭУЕ WinabMS 98 нувло ошва tydes мжг нлвсщигься MB edir=-dir-; Sfree=Sdir[S*dir]; Sfree=-s/.*((\d,] + ) \v«-free/$l/; $free="s/, g; } elsif (50 eq linux) { t В ПОСЛЭДЩХ строках соов1Энш ксмащы df -к f должно находься нечто наподобие: t t Filesystem blocks Used Avail Capacity Mounted on t /dev/wdOsla 31775 21431 7802 73S& / » Таким образов, количество свободных блоков по 1024 байта 11 -й час. Взаимодействие с операционной системой 183 f шжщшься в 1ы;р1Шпопе слева. I lijppQaja. фср шнда гроЕзяг в остаок linux и bsd edir=df -к Sfree=(split(/\s+/, $dir[$#dir])ЦЗ]; Sfree*=1024! } else{ $free=0; f ЗнаВЕхе no лсшаЕзш) vem Чйсвеспьй тип стнцжысй cHCTeioi\ii"; return $f гее; Теперь, когда вам понадобится определить, сколько места осталось на диске, вызовите функцию freespace(), и она вернет нужное значение. Если же эта функция будет вызвана в той операционной системе, которая ею не поддерживается, на экране появится сообщение об ошибке. Исправить нодобную ситуацию довольно просто - добавьте еше один блок elsif в условный оператор if. Резюме На этом занятии вы узнали, как воспользоваться утилитами операционной системы для выполнения поставленной задачи. Для запуска системной утилиты или конвейера в Perl предназначена функция system. Чтобы получить данные, выведенные утилитой на стандартное устройство вывода, следует поместить команду вызова в обратные кавычки С). В результате появляется возможность присвоить эти данные переменной для дальнейшей обработки средствами язык г1. С помощью функции open можно открывать не только файлы, содержащие данные, но и файлы с программами. Для записи операторов программы на Perl в файл используется оператор print, а для чтения - угловые скобки (о). И в конце занятия была продемонстрирована методика написания переносимых программ, которые могут без изменения работать на разных компьютерных платформах. При этом не требуется написание отдельных версий программы для каждой поддерживаемой платформы, поскольку в Perl есть средства, позволяющие программе определить тип платформы, на которой она выполняется. Вопросы и ответы Как откргть конвейер, чтобы получить данные от одной программы, обработать их и передать другой программе? Почему не работает оператор наподобие ореп(Р, " команда ")? Решение этой простой задачи на деле оказывается гораздо сложнее, чем может показаться на первый взгляд. Причина заключается в том, что попытка чтения и записи в конвейер со стороны одного и того же процесса приводит к взаимной блокировке процессов. В самом деле, после открытия конвейера при попытке выполнить чтение с помощью оператора <Р> ваша программа будет переведена в состояние ожидания появления данных от программы команда. В то же время программа команда будет ожидать появления данных от вашей программы. Таким образом, произойдет взаимная блокировка двух программ, выхода из которой нет. Однако если будет включен режим вьщачи предупреждений, интерпретатор Perl выведет сообщение Cant do bidirectional pipe (Нельзя создать двунаправленный конвейер). Если вы столкнулись с подобной проблемой, воспользуйтесь модулем IPC: :0реп2, с помощью которого можно создать двунаправленный конвейер. Работа с модулями будет описана на 14-м занятии, "Использование модулей". 1 II. углубляемся e 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 |