LINUX.ORG.RU

perl. пишу функцию форматного вывода, помогите в некоторых деталя.


0

0

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

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

>ниасилил, афтар, пеши исче

:)

Наверное надо было просто выбрать из все "формат символы" и заменить на их значение, типа:

$fstr =~ s/\%(\w+)/exists $form_func{$1} ? $form_func{$1} : "%" . $1/ge;

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

2roller

да спасибо ,вы меня на мысль навели, тепреь сделаю вот только ваш пример реализации немного подправлю

сори что так долго не отвечал, сегодня весь день дома небыл, ездил на linuxworldrussia

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