| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > пишу функцию форматного вывода, помогите в некотор |
| Автор: Guest 6.9.2005, 15:04 |
| #!/usr/bin/perl -w sub check_array { @array=@{$_[0]}; if (ref($_[1]) eq "ARRAY") { @to_find = @{$_[1]}; } elsif (ref($_[1]) eq "SCALAR") { @to_find=("${$_[1]}"); } my $ar_found = 1; for ($i_f=0; ($i_f <= $#to_find) && $ar_found; $i_f++) { my $el_found=0; foreach $e_ar (@array) { if ($to_find[$i_f] eq $e_ar) { $el_found = 1; } } $ar_found = $ar_found && $el_found; } return $ar_found; } sub output { my ($fstr, %form_func) = @_; my @args = split(/%(\w{2})/, $fstr); my @funcs = keys %form_func; foreach $arg (@args) { if (check_array(\@funcs, \$arg)) { print eval($form_func{"$arg"}); } else { print $arg; } } } $host = 'test_host'; $port = 'test_port'; output('%ip:%pp', 'ip' => '$host', 'pp' => '$port' ); итак сама функция называется output() , функция check_array() вспомогательная ,она возвращает булевые значения если массивы идентичны или какой то скаляр входит в массив (на самом деле передаются указатели на соответствующие структуры данных, как можно видеть из кода) , параметрами функции форматного вывода являются собственно по какому шаблону выводить , и соответствие ключей шаблона тому что реально подставляется в вывод всё что несоответствует образцу в массиве @funcs просто выводится а не подставляется ничего например если в вышепреведённом примере мы вызовем функцию с параметрами output('%ip:%pp%test', 'ip' => '$host', 'pp' => '$port' ); то она выведет test_host:test_port%test то есть %test нет соответствия в параметрах которые мы передали, так же и происходит со всеми символами которые не попадают под образец передо мной стоит следущая проблема: в коде функции output(); я определяю эти самые ключи форматирования по следующему кримерию my @args = split(/%(\w{2})/, $fstr); тоесть символ процента и ещё 2 символа после него я не могу придумать алгоритм как определять параметры которые различаются по длине названия например %test %t соответственно 4 символа и 1 IMHO только регулярным выражениям сдесь не обойтись... была идея ограничивать ключи форматирования примерно так %test; но это мне не нравится, если я хочу просто вывести точку с запятой... вобщем много мусора получится хочу чтоб всё по человечески было помогите плиз ,заранее благоарен p.s. код ещё сыроват ,порядрк наведу потом ,главное чтобы знать алгоритм решения проблемы |
| Автор: sharq 6.9.2005, 22:01 |
| Не ограничивай разбор длиной, ограничивай - разделителями. Например, введи ??: text??texttext??blabla. И разбирай по разделителям, как тебе угодно, не надо зацикливаться на переменной длине. Всегда интересней общаться с тем кого знаешь, хотя бы имя. Зарегистрируйся! |
| Автор: Guest 7.9.2005, 20:54 |
| хех , была у меня такая идея если честно не нравится мне так потому как куччу "мусора" надо будет помимо вводить >Всегда интересней общаться с тем кого знаешь, хотя бы имя. Зарегистрируйся! если вам со мной хочется о чём то пообщаться ,просто скажите, я скажу вам свой ICQ UIN или адрес почты |
| Автор: korob2001 8.9.2005, 18:42 | ||
А почему не пользуешься format'ом?
|