Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - подстановка значений с охватом наружных скобок / 7 сообщений из 7, страница 1 из 1
16.09.2015, 23:48
    #39053343
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
Допустим есть такой текстовый шаблон:
Код: plaintext
Hello {USERNAME}. Welcome[ to {SITE}]!
Выражения в фигурных скобках заменяются значениями хеша.
Квадратные скобки, содержащие внутри выражение в фигурных скобках, удаляются (заменяются пустой строкой), если соответствующее значение хеша пустое.

С первой частью проблем нет:
Код: php
1.
2.
3.
my $hash = {...};
my $msg = 'Hello {USERNAME}. Welcome[ to {SITE}]!';
$msg =~ s/{(.*?)}/$hash->{uc($1)}/g;



А вот как сделать второе, не придумаю.
Должно быть что-то типа такого:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
my $hash = {...};
my $msg = 'Hello {USERNAME}. Welcome[ to {SITE}]!';

sub usersubst
{
  my $scope = shift;
  my $field = shift;
  return '' unless ($hash->{$field});
  $scope =~ s/{(.*?)}/$hash->{uc($1)}/g;
  return $scope;
}

$msg =~ s/\([.*{(.*?)}.*?\])/&usersubst($1,$2)/g;
$msg =~ s/{(.*?)}/$hash->{uc($1)}/g;


Но что-то тут неправильно.

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
17.09.2015, 00:14
    #39053363
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
Способ все же был рабочий, я просто флаг e забыл указать:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
sub _subst($$)
{
	my $tpl = shift;
	my $var = shift;
	return undef unless(defined($tpl));
	return $tpl unless(defined($var));
	my $substre = sub
	{
		my $scope = shift;
		my $field = shift;
		return '' unless($var->{$field});
		$scope =~ s/{([-_0-9A-Za-z]+?)}/$var->{uc($1)}/g;
		return $scope;
	};
	$tpl =~ s/\[(.*?{([-_0-9A-Za-z]+?)}.*?)\]/&$substre($1,$2)/eg;
	$tpl =~ s/{([-_0-9A-Za-z]+?)}/$var->{uc($1)}/g;
	return $tpl;
}



А не подскажите, можно ли обойтись чистыми регулярными выражениями?
...
Рейтинг: 0 / 0
17.09.2015, 14:21
    #39053927
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
Alibek B.,

упомяну на всяк. случай штатную возможность интерполяции любых выражений внутри двойных кавычек
с помощью синтаксиса " @{ ... } "

чтобы результат интерполяции не улетел в белый свет, добавляются квадратные скобки.

Код: php
1.
2.
3.
sub counter { "раз-два-три-четыре-пять" }

" @{[ counter ]}, вышел зайчик @{[ $a>$b ? погулять : просто пописать]} !!! "
...
Рейтинг: 0 / 0
17.09.2015, 14:27
    #39053938
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
ну и понятное дело
наличие готового

Text::Template
...
Рейтинг: 0 / 0
17.09.2015, 16:15
    #39054126
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
volodin661упомяну на всяк. случай штатную возможность интерполяции любых выражений внутри двойных кавычек
с помощью синтаксиса " @{ ... } "
Perl не устает удивлять, я про такое использование не догадывался.
Но насколько я понял, мне это не пригодится.
Мне нужно другое:
ШаблонUSERNAMESITEРезультатHello {USERNAME}. Welcome to {SITE}!alexhomepageHello alex. Welcome to homepage!Hello {USERNAME}. Welcome to {SITE}!alexHello alex. Welcome to !Hello {USERNAME}. Welcome to {SITE}!Hello . Welcome to !Hello {USERNAME}. Welcome[ to {SITE}]!alexhomepageHello alex. Welcome to homepage!Hello {USERNAME}. Welcome[ to {SITE}]!alexHello alex. Welcome!Hello {USERNAME}. Welcome[ to {SITE}]!Hello . Welcome!
...
Рейтинг: 0 / 0
17.09.2015, 23:19
    #39054530
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
Alibek B.,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
use 5.010;
our $USERNAME   = "alex";
our $SITE       = "homepage";
my  $str        = 'Hello {USERNAME}. Welcome[ to {SITE}]!';


$str =~ s/ \{ (\w+) \} / $$1 /gex;
$str =~ s/ \[ (.+) \] / index($1,$SITE)>=0? $1 : "" /ex;


say$str;
...
Рейтинг: 0 / 0
17.09.2015, 23:39
    #39054546
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perl - подстановка значений с охватом наружных скобок
Alibek B.Perl не устает удивлять, я про такое использование не догадывался.

в Perl6 покруче будет,

там интерполяция просто "{ ... }";

вдобавок модификаторами снаружи можно управлять, что интерполируется в двойных кавычках, а что нет.

например, можно так: бэкслэши и массивы интерполируются, а скаляры и код в фигурных скобках нет.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - подстановка значений с охватом наружных скобок / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]