Анимация
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 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

1.17. Программа: fixstyle 59

Параметр -t выводит сообщение об ожидании ввода с клавиатуры при отсутствии других аргументов. Если пользователь забыл ввести имя файла, он сразу поймет, чего ожидает программа.

Пример 1.4. fixstyle

#!/usr/bin/perl -w

# fixstyle - замена строк секции <DATA> парными строками

# использование: $0 [-v] [файлы...] use strict;

my Sverbose = (@ARGV && $ARGV[0] eq -v && shift);

# Сохранить старые файлы

if (@ARGV) {

$"1 = ".orig"; } else {

warn "$0: Reading from stdin\n" if -t STDIN;

my $code = "while (<>) {\n"; # Читать данные и строить код для eval while (<DATA>) { chomp;

my (Sin, Sout) = split /\s*=>\s*/;

next unless Sin && $out;

Scode .= "s{\\Q$in\\E}{$out}g";

Scode .= "&& printf STDERR qq($in => Sout at \$ARGV line \$,\\n)

if Sverbose;

Scode .= ";\n";

Scode .= "printf;\n}\n";

eval "{ code }

1"

II die;

END

analysed

=>

analyzed

built-in

=>

builtin

chastized

=>

chastised

commandline

=>

command-line

de-allocate

=>

deallocate

dropin

=>

drop-in

hardcode

=>

hard-code

meta-data

=>

metadata

multicharacter

=>

multi-character

multiway

=>

multi-way

non-empty

=>

nonempty

non-profit

=>

nonprofit

non-trappable

=>

nontrappable

pre-define

=>

predefine

preextend

=>

pre-extend

re-compiling

=>

recompiling

reenter

=>

re-enter

turnkey

=>

turn-key



Небольшое предупреждение: программа работает быстро, но не в тех случаях, когда количество замен измеряется сотнями. Чем больше секция DATA, тем больше времени потребуется. Несколько десятков замен не вызовут существенного замедления. Более того, для малого количества замен эта версия работает быстрее следующей. Но если запустить программу с несколькими сотнями замен, она начнет заметно отставать.

В примере 1.5 приведена следующая версия программы. При малом количестве замен она работает медленнее, а при большом - быстрее.

Пример 1.5. fixstyle2

#1/usr/bin/perl -w

# fixstyle2 = аналог fixstyle для большого количества замен use strict

my Sverbose = ((SARGV 8.8. $ARGV[0] eq -v 8.8. shift), my Schange = (), while (<DATA>) { chomp,

my ($in, $out) = split /\s.=>\s«/, next unless $in &8. $out, $change{$in} = $out,

If ((SARGV) {

$"I = orig , } else {

warn $0- Reading from stdin\n if -t STDIN,

while (<>) { my $1 =0,

s/"(\s+) print $1, # Выдать начальный пропуск for (split /(\s+)/, $ , -1) {

print( ($1++ 8. 1) $ ($change{$ } $ )),

END

analysed => analyzed

built-in => builtin

chastized => chastised commandline => command-line de-allocate => deallocate dropin => drop-in

hardcode => hard-code

meta-data => metadata multicharacter -> multi-character multiway => multi-way

non-empty => nonempty



1.18. Программа: psgrep 61

non-profit => nonprofit non-trappable => nontrappable pre-define => predefine preextend => pre-extend

re-compiling => recompiling reenter => re-enter

turnkey => turn-key

В новой версии программы каждая строка разбивается на пропуски и слова (относительно медленная операция). Затем слова используются для поиска замены в хэше, что выполняется сушественно быстрее подстановки. Следовательно, первая часть работает медленнее, а вторая - быстрее. Выигрыш в скорости зависит от количества совпадений.

Если бы мы не старались сохранить количество пропусков, разделяющих слова, нетрудно сделать так, чтобы вторая версия не уступала первой по скорости даже при небольшом количестве замен. Если вам хорошо известны особенности входных данных, пропуски можно заменить одиночными пробелами. Для этого применяется следующий цикл:

и Работает очень быстро, но со сжатием пропусков while (О) {

for (split) {

print $change{$ } $ ,

print \n ,

в конце каждой строки появляется лишний пробел. Если это нежелательно, воспользуйтесь методикой рецепта 16.14 и создайте входной фильтр. Вставьте следующий фрагмент перед циклом while, сжимающим пропуски:

ту $pid = open(STDOUT, = ),

die cannot fork $ unless defined $pid,

unless ($pid) {

while (<STDIN>) {

s/ $ ,

print,

exit.

1.18. Программа: psgrep

Многие программы (в том числе ps, netstat, Is -I, find -Is и tcpdump) часто выдают большие объемы данных. Файлы журналов тоже быстро увеличиваются в размерах, что затрудняет их просмотр. Такие данные можно обработать программой-фильтром типа grep и отобрать из них лишь часть строк, однако регулярные выражения плохо согласуются со сложной логикой - достаточно взгляну 1Ь на ухищрения, па которые приходится пускаться в рецепте 6.17.



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