#!/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
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Perl - что использовать в качестве ключа в хэше (2012)
- Новости PHP 7.1 (2016)
- Новости Perl 5.20 (2014)
- Форум Qt форматный вывод числа (2010)
- Форум [vala][srt2tmx] Покритикуйте код (2012)
- Форум perl — функция (2002)
- Форум Скрыть некоторые функции (2012)
- Форум небуферизованные функции вывода (2005)
- Форум [perl]Переменная-функция. (2010)
- Форум Perl функция substr (2007)