![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Guest |
|
|||
|
Unregistered |
#!/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 |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Не ограничивай разбор длиной, ограничивай - разделителями.
Например, введи ??: text??texttext??blabla. И разбирай по разделителям, как тебе угодно, не надо зацикливаться на переменной длине. Всегда интересней общаться с тем кого знаешь, хотя бы имя. Зарегистрируйся! -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
хех , была у меня такая идея
если честно не нравится мне так потому как куччу "мусора" надо будет помимо вводить >Всегда интересней общаться с тем кого знаешь, хотя бы имя. Зарегистрируйся! если вам со мной хочется о чём то пообщаться ,просто скажите, я скажу вам свой ICQ UIN или адрес почты |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
А почему не пользуешься format'ом?
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |