Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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.
И разбирай по разделителям, как тебе угодно, не надо зацикливаться на переменной длине.

smile

Всегда интересней общаться с тем кого знаешь, хотя бы имя. Зарегистрируйся! smile

Автор: Guest 7.9.2005, 20:54
хех , была у меня такая идея

если честно не нравится мне так

потому как куччу "мусора" надо будет помимо вводить

>Всегда интересней общаться с тем кого знаешь, хотя бы имя. Зарегистрируйся!
если вам со мной хочется о чём то пообщаться ,просто скажите, я скажу вам свой ICQ UIN или адрес почты

Автор: korob2001 8.9.2005, 18:42
А почему не пользуешься format'ом?
М
 
Пожалуйста, пользуйтесь кнопкой "КОД", пропадает форматироваение кода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)