проблемка при работе с регехпами, которые хрянятся в переменной.
те-
$text =~ s!\[url\]([\w]+?://.*?[^ \"\n\r\t<]*?)\[/url\]!<a herf=$1>$1</a>!gi;
так работает;а так -
my $expr = '\[url\]([\w]+?://.*?[^ \"\n\r\t<]*?)\[/url\]';
my $tr = '<a herf=$1>$1</a>';
$text =~ s!$expr!$tr!gi;заменяет на '<a herf=$1>$1</a>';
Спасибо всем, кто откликнется.
>проблемка при работе с регехпами, которые хрянятся в переменной.
>те-
>$text =~ s!\[url\]([\w]+?://.*?[^ \"\n\r\t<]*?)\[/url\]!<a herf=$1>$1</a>!gi;
>так работает;
>
>а так -
>my $expr = '\[url\]([\w]+?://.*?[^ \"\n\r\t<]*?)\[/url\]';
>my $tr = '<a herf=$1>$1</a>';
>$text =~ s!$expr!$tr!gi;
>
>заменяет на '<a herf=$1>$1</a>';
>
>Спасибо всем, кто откликнется.
#!/usr/local/bin/perl -w
$t="test";
my $test="<a href=$t>$t</a>";
print $test,"\n";
exit 0;
не то :)
проблемма в том, что СНАЧАЛА определяются "темлейты"
а потом они оббрабатываются regexpr
>не то :)
>проблемма в том, что СНАЧАЛА определяются "темлейты"
>а потом они оббрабатываются regexpr
A tak:
[root@test perl]# cat 021.pl
#!/usr/local/bin/perl -w$t="\^test.\$";
open FH,"test";
while (<FH>){
print if /$t/;
}
close FH;
[root@test perl]# cat test
tst
test1
test2
tst3
test5
test6
test123
[root@test perl]# ./021.pl
test1
test2
test5
test6
ещё раз нет. реальная ситуация в коде выглядит так:my (@expr, @tr );
....
push @expr, '\[url\]([\w]+?://.*?[^ \"\n\r\t<]*?)\[/url\]';
push @tr, '<a herf=$1>$1</a>';
push @expr, '\[url\]((www|ftp)\.([\w\-]+\.)*?[\w\-]+\.[a-z]{2,4}(:?[0-9]*?/[^ \"\n\r\t<]*)?)\[/url\]';
push @tr, '<a herf=$1>$1</a>';
.....
sub pasre
{
my $text = $_[0];
my $i = 0;
foreach (@expr)
{
$text =~ s/$expr[$i]/$tr[$i]/gi;
$i++;
}
return $text;
}
>ещё раз нет. реальная ситуация в коде выглядит так:
>
>my (@expr, @tr );
>....
>push @expr, '\[url\]([\w]+?://.*?[^ \"\n\r\t<]*?)\[/url\]';
>push @tr, '<a herf=$1>$1</a>';
>push @expr, '\[url\]((www|ftp)\.([\w\-]+\.)*?[\w\-]+\.[a-z]{2,4}(:?[0-9]*?/[^ \"\n\r\t<]*)?)\[/url\]';
>push @tr, '<a herf=$1>$1</a>';
>.....
>sub pasre
>{
>my $text = $_[0];
>my $i = 0;
>foreach (@expr)
> {
> $text =~ s/$expr[$i]/$tr[$i]/gi;
> $i++;
> }
>return $text;
>}
Nu a tak:
[root@test perl]# cat 021.pl
#!/usr/local/bin/perl -wmy (@expr,@replace);
push @expr,"\^test.\$";
push @expr,"\^tst\$";
push @replace,"t";
push @replace,"r";
open FH,"test";
while (<FH>){
foreach $te(@expr){
if (/$te/) {
s/$te/$replace[$i]/gi;
print $_;
}
$i++;
}
} continue {
$i=0;
}
close FH;
[root@test perl]# cat test
tst
test1
test2
tst3
test5
test6
test123
[root@test perl]# ./021.pl
r
t
t
t
и опять не то :)))
проблемма в том, что в $replace нужно использовать части заменяемого
те [url]http://ya.ru[/url] заменися на <a href="http://ya.ru">http://ya.ru</a>для этого в строке подстоновки использууются перенменные $1, $2 и т.д.
но! если строку подстоновки брать из перменной, но $1 интерпритируется не как переменная, а как '$1'
это и нужно решить
man perlop
на предмет qr
и ещё раз нет;
цитируюю ман:
========BEGIN===========
For example,
$rex = qr/my.STRING/is;
s/$rex/foo/;
=========END============нужно:
$replace = '$2 - $1';
$text = 'test1 test2';
$text =~ s/([\w+]) ([\w+])/$replase/gi;получается $text = '$2 - $1' те переменные в строке замены не интрпритирутся как переменные
нужно $text = 'test2 test1'
PS видемо я не правильно сформулировал сабж
>и ещё раз нет;
>цитируюю ман:
>========BEGIN===========
>For example,
>$rex = qr/my.STRING/is;
>s/$rex/foo/;
>=========END============
>
>нужно:
>$replace = '$2 - $1';
>$text = 'test1 test2';
>$text =~ s/([\w+]) ([\w+])/$replase/gi;
>
>получается $text = '$2 - $1' те переменные в строке замены не
>интрпритирутся как переменные
>
>нужно $text = 'test2 test1'
>
>PS видемо я не правильно сформулировал сабжDa ne ispolzui ' a ".
>Da ne ispolzui ' a ".
тогда получится, что переменные бдут присваиваться при присвоении.
те
$replace = "$2 - $1";
станет $replace = ' - ';
или, если экранировать переменные так \$1, то ситуация будет как с однинарными кавычками
В ообщем я обошел эту необходимость в коде другми средствами.
Но, все-таки, интерено. есть-ли способ при отращении к переменной подставлять в неё записаанные в ней перемнные
>В ообщем я обошел эту необходимость в коде другми средствами.
>Но, все-таки, интерено. есть-ли способ при отращении к переменной подставлять в неё
>записаанные в ней перемнные
$text =~ s/([\w+]) ([\w+])/$replase/gi;
eval("\$text =~ s/([\w+]) ([\w+])/$replase/gi;");
и ещё рвз нет!
может я чего не понимаю, но как пметить ваш совет к ситуацииmy $replace = '$2 test $1'
my $text = '123 321';
$text =~ s/(\d+) (\d+)/$replace/gi;
нужно что-бы
$text == '321 test 123'
а получается $text == '$2 test $1'нужно "резолвить" перевенные, которые записанны в переменной.
>и ещё рвз нет!
>может я чего не понимаю, но как пметить ваш совет к ситуации
>
>
>my $replace = '$2 test $1'
>my $text = '123 321';
>$text =~ s/(\d+) (\d+)/$replace/gi;
>нужно что-бы
>$text == '321 test 123'
>а получается $text == '$2 test $1'
>
>нужно "резолвить" перевенные, которые записанны в переменной.man perlre
В вашем случае переменные действительно не будут подставляться. Так как эта подстановка произойдет уже после анализа 1-й частиЖ
ВОТ ЧТО РАБОТАЕТ:
$a = '$1 - $2';
$t = "123 124";
print "$t\n";
eval ("\$t =~ s/(\\d+) (\\d+)/$a/;");print "$t\n";
$subst = '$1, $2 and others...';# better would be
$text =~ s/$my_regex/eval('"$substr"')/e;