Анимация
JavaScript
|
Главная Библионтека 7.5. Создание временных файлов 251 END { unlink($name) or die "Couldnt unlink $name : $!" } # Перейти к использованию файла... Комментарий Если все, что вам нужно, - область для временного хранения данных, воспользуйтесь методом new tmpf Не модуля IO::File. Он возвращает файловый манипулятор для временного файла, открытого в режиме чтения/записи фрагментом следующего вида: for (;;) { $пагае = tmpnam(); sysopen(TMP, Stttipnatti, 0 RDWR O.CREAT 0 EXC) M last; unlink Stttipnam; Файл автоматически удаляется при нормальном или аварийном завершении программы. Вам не удастся определить имя файла и передать другому процессу, потому что у него нет имени. В системах с поддержкой подобной семантики имя удаляется еще до завершения метода. Впрочем, открытый файловый манипулятор может наследоваться производными процессами. Ниже показан пример практического применения new tmpf Не. Мы создаем временный файл, выполняем запись, возвращаемся к началу и выводим записанные данные: use 10::File; $fh = 10::File->new tmpfile or die "10:.File->new tmpfile: $!"; $fh->autoflush(1); print( $fh "$i\n" while $i++ < 10; seek($fh, 0, 0); print "Tttip file has: ", <$fh>; Bo втором варианте создается временный файл, имя которого можно передать другому процессу. Мы вызываем функцию POSIX: :tmpnam, самостоятельно открываем файл и удаляем его после заверщения работы. Перед открытием файла мы не проверяем, существует ли файл с таким именем, поскольку при этом может произойти подмена - кто-нибудь создаст файл между проверкой и созданием. Вместо этого tmpnam вызывается в цикле, что гарантирует создание нового файла и предотвращает случайное удаление существующих файлов. Теоретически метод new tmpf Не не должен возвращать одинаковые имена разным процессам. > Смотри также- Документация по стандартным модулям IO::File и POSIX; рецепт 7.19; страница руководства tmpnam(3) вашей системы. Но перед вызовом exec следует присвоить $F хотя бы fileno($fh). См. рецепт 19.4. 7.6. Хранение данных в тексте программы Проблема Некоторые данные должны распространяться вместе с программой и интерпретироваться как файл, но при этом они не должны находиться в отдельном файле. Решение Лексемы DATA и END после исходного текста программы отмечают начало блока данных, который может быть прочитан программой или модулем через файловый манипулятор DATA. В модулях используется лексема DATA : while (<DATA>) { # Обработать строку > ОАТА # Данные Аналогично используется END в главном файле программы: while (<main::DATA>) { # Обработать строку END # Данные Комментарий Лексемы DATA и END обозначают логическое завершение модуля или сценария перед физическим концом файла. Текст, находящийся после DATA или END , может быть прочитан через файловый манипулятор DATA уровня пакета. Предположим, у нас имеется гипотетический модуль Primes; текст пост ле DATA в файле Primes.pm может быть прочитан через файловый манипулятор Primes: :DATA. Лексема END представляет собой синоним DATA в главном пакете. Текст, следующий после лексем ENO в модулях, недоступен. Появляется возможность отказаться от хранения данных в отдельном файле и перейти к построению автономных программ. Такая возможность нередко используется для документирования. Иногда в программах хранятся конфигурационные или старые тестовые данные, использованные при разработке программ, - они могут пригодиться в процессе отладки. Манипулятор DATA также применяется для определения размера или даты последней модификации текущей программы или модуля. В большинстве систем переменная $0 содержит полное имя файла для работающего сценария. В тех системах, где значение $0 оказывается неверным, можно воспользоваться манипулятором DATA для определения размера, даты модификации и т. д. Вставьте в конец файла специальную лексему DATA (и предупреждение о том, что DATA не следует удалять), и файловый манипулятор DATA будет связан с файлом сценария. В npoq)aMMe показанный фрагмент не будет работать из-за внутренней специфики ARGV. use POSIX qw(strftime); $raw time = (stat{DATA))[9]; $size = -s DATA; $kilosize = int($size / 1024) . k; print "<P>Script size is $kilosize\n": print strftime("<p>Last script update: %c (%Z)\n", localtime($raw time)); DATA DO NOT REMOVE THE PRECEDING LINE Everything else in this file will be ignored. > Смотри также- Раздел Scalar Value Constructors»perldata(i). 7.7. Создание фильтра Проблема Вы хотите написать программу, которая получает из командной строки список файлов. Если файлы не заданы, входные данные читаются из STDIN. При этом пользователь должен иметь возможность передать программе " -" для обозначения STDIN или "someprogram " для получения выходных данных другой программы. Программа может непосредственно модифицировать файлы или выводить результаты на основании входных данных. Решение Читайте строки оператором, оператор> <>: while (о) { # Сделать что-то со строкой Комментарий Встречая конструкцию: while (о) { Perl преобразует ее к следующему виду: unshift(@ARGV, •-) unless @ARGV; while($AR6V = shift @ARGV) { unless (open(AR6V, $AR6V)) { 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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |