#!/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. код ещё сыроват ,порядрк наведу потом ,главное чтобы знать алгоритм решения проблемы

Ответ на:
комментарий
от vilfred

Ответ на:
комментарий
от roller

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.