Jak escapovat $1 v perlu?

Pavel Lisý pali na tmapy.cz
Pondělí Červenec 16 15:56:47 CEST 2007


Erich Vinclav píše v Po 16. 07. 2007 v 13:39 +0100:
> On Mon, 16 Jul 2007 14:33:27 +0200, Pavel Lisý wrote
> > Dobrý den
> > 
> > potřeboval bych poradit, jak napsat něco v perlu. Nemohu na to nějak
> > přijít a určitě je to jednoduché:
> 
> > 
> > &change_file($file,"^\([^#]*-autorespond\)", "# \$1" );
>                                                ^^^^^^^
> 
> "# ".$1
Toto nefunguje, zkusím více vysvětlit o co mi jde.

Uvedu raději znovu celou část programu:
--------------------------
sub change_file
{
    my($file, $pattern, $replace) = @_;

    print "file: ".$file ."\n";
    print "pattern: ".$pattern ."\n";
    print "replace: ".$replace ."\n";

    open(FILEOUT, ">$file");
    foreach $line (@lines) {
       $line =~  s/$pattern/$replace/g;
       print FILEOUT $line ;
    }
    close(FILEOUT);

}      

&change_file($file,"^\([^#]*-autorespond\)", "# ".$1 );
--------------------------

Při spuštění to vypíše toto:
file: testovani.txt
pattern: ^([^#]*-autorespond)
replace: # 
...
# 

a já bych potřeboval aby poslední řádek byl 
# neco-autorespond

Původní varianta
&change_file($file,"^\([^#]*-autorespond\)", "# $1");
dělá to samé.

Problém podle mě spočívá v tom, že perl interpretuje $1 již na řádku 
&change_file($file,"^\([^#]*-autorespond\)", "# ".$1 );

a na řádek
$line =~  s/$pattern/$replace/g;
se v $replace dostane pouze "# "

pokud do sub change_file ()
napíšu natvrdo
$line =~  s/$pattern/# $1/g
tak to zafunguje správně, ale já potřebuji ty $pattern a $replace
zadávat dynamicky (parametrem)

Ještě nějaké nápady?

Pavel




Další informace o konferenci Linux