URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3408
[ Назад ]

Исходное сообщение
"rexepr in variable"

Отправлено rWizard , 22-Сен-04 21:44 
проблемка при работе с регехпами, которые хрянятся в переменной.
те-
$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>';

Спасибо всем, кто откликнется.


Содержание

Сообщения в этом обсуждении
"rexepr in variable"
Отправлено Brainbug , 23-Сен-04 10:01 
>проблемка при работе с регехпами, которые хрянятся в переменной.
>те-
>$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;


"rexepr in variable"
Отправлено rWizard , 23-Сен-04 16:09 
не то :)
проблемма в том, что СНАЧАЛА определяются "темлейты"
а потом они оббрабатываются regexpr

"rexepr in variable"
Отправлено Brainbug , 23-Сен-04 16:45 
>не то :)
>проблемма в том, что СНАЧАЛА определяются "темлейты"
>а потом они оббрабатываются 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


"rexepr in variable"
Отправлено rWizard , 23-Сен-04 17:11 
ещё раз нет. реальная ситуация в коде выглядит так:

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;
}


"rexepr in variable"
Отправлено Brainbug , 23-Сен-04 17:47 
>ещё раз нет. реальная ситуация в коде выглядит так:
>
>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 -w

my (@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


"rexepr in variable"
Отправлено rWizard , 23-Сен-04 20:24 
и опять не то :)))
проблемма в том, что в $replace нужно использовать  части заменяемого
те [url]http://ya.ru[/url] заменися на <a href="http://ya.ru">http://ya.ru</a>

для этого в строке подстоновки использууются перенменные $1, $2 и т.д.
но! если строку подстоновки брать из перменной, но $1 интерпритируется не как переменная, а как '$1'
это и нужно решить


"rexepr in variable"
Отправлено ihor , 24-Сен-04 01:33 
man perlop
на предмет qr

"rexepr in variable"
Отправлено rWizard , 24-Сен-04 04:38 
и ещё раз нет;
цитируюю ман:
========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 видемо я не правильно сформулировал сабж


"rexepr in variable"
Отправлено Brainbug , 24-Сен-04 10:13 
>и ещё раз нет;
>цитируюю ман:
>========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 ".


"rexepr in variable"
Отправлено rWizard , 24-Сен-04 19:18 
>Da ne ispolzui ' a ".
тогда получится, что переменные бдут присваиваться при присвоении.
те
$replace = "$2 - $1";
станет $replace = ' - ';
или, если экранировать переменные так \$1, то ситуация будет как с однинарными кавычками


"rexepr in variable"
Отправлено rWizard , 24-Сен-04 23:34 
В ообщем я обошел эту необходимость в коде другми средствами.
Но, все-таки, интерено. есть-ли способ при отращении к переменной подставлять в неё записаанные в ней перемнные



"rexepr in variable"
Отправлено konst , 27-Сен-04 19:43 
>В ообщем я обошел эту необходимость в коде другми средствами.
>Но, все-таки, интерено. есть-ли способ при отращении к переменной подставлять в неё
>записаанные в ней перемнные
$text =~ s/([\w+]) ([\w+])/$replase/gi;
eval("\$text =~ s/([\w+]) ([\w+])/$replase/gi;");

"rexepr in variable"
Отправлено rWizard , 27-Сен-04 22:16 
и ещё рвз нет!
может я чего не понимаю, но как пметить ваш совет к ситуации

my $replace = '$2 test $1'
my $text = '123 321';
$text =~ s/(\d+) (\d+)/$replace/gi;
нужно что-бы
$text == '321 test 123'
а получается $text == '$2 test $1'

нужно "резолвить" перевенные, которые записанны в переменной.


"rexepr in variable"
Отправлено konst , 28-Сен-04 12:29 
>и ещё рвз нет!
>может я чего не понимаю, но как пметить ваш совет к ситуации
>
>
>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";


"rexepr in variable"
Отправлено mirya , 02-Окт-04 20:00 
$subst = '$1, $2 and others...';

# better would be
$text =~ s/$my_regex/eval('"$substr"')/e;