> Programming Languages > Perl
Various Topics Home | Disclaimer | Report Adult Posts

Various Topics on Perl



Perl - "using regexes as command line parameters" in Programming Languages


Old 11-18-2004   #1
..I
 
Default using regexes as command line parameters

Hello

Short question, but maybe somebody knows how-to

Let's imagine your program accepts two command line arguments to perform
replaces in a string:
usage: myprogram -s "foo" -r "bar"
where s is the search regex and r the replace regex.

Everything works fine, even grouping with parenthesis, etc. As described in
detail in the cookbook.

But:
When I want to use a captured value in the replacement regex, it does
simply not work. Using all possible syntaxes ( as \$1, or \\$1...) only
leads to either an exmpty value in the replaced string, or a plain-text
"$1" text when too much is escaped.

The code looks like:

my $rx;
if ($case_sensitive) {
$rx = qr/$search_pattern/;
} else {
$rx = qr/$search_pattern/i;
}
print "Patching file:\t$origin\n" if ($debug_mode ||
$verbose_mode);
my $myfile = '';

print "Opening $origin\n" if $debug_mode;
open(OLD, "< $origin")
while (<OLD>) {
$myfile .= $_;
}
print "Closing $origin\n" if $debug_mode;
close(OLD)

open(NEW, "> $playground")
print "Replacing $search_pattern with $replace_pattern\n" if
$debug_mode;
$myfile =~ s/$rx/$replace_pattern/gs;
print NEW $myfile
close(NEW)

Hope it's the right place to find some people having had the same
problem,....

thanks and best regards
JM
 
Old 11-18-2004   #2
.... ..l..
 
Default Re: using regexes as command line parameters

"JMI" <waggis_at_hotmail.com> wrote in message
news:Xns95A5B40F63810waggishotmailcom@192.37.1.74. ..
> Let's imagine your program accepts two command line arguments to

perform
> replaces in a string:
> usage: myprogram -s "foo" -r "bar"
> where s is the search regex and r the replace regex.
>
> Everything works fine, even grouping with parenthesis, etc. As

described in
> detail in the cookbook.
>
> But:
> When I want to use a captured value in the replacement regex, it does
> simply not work. Using all possible syntaxes ( as \$1, or \\$1...)

only
> leads to either an exmpty value in the replaced string, or a

plain-text
> "$1" text when too much is escaped.


Giving simply $1 makes the shell p*** the shell's own $1 variable to
your script.
Giving \$1 p***es the literal string '$1' to your script.

What you need to do is tell Perl to evaluate that literal string as
Perl:

perl -le'$_ = q/foo/; s/($ARGV[0])/$ARGV[1]/ee; print;' foo \$1

This is a trivial example, of course, but it does illustrate that perl
is correctly replacing 'foo' with the captured match (which also happens
to be 'foo').

For more info, look up the /e modifier in
perldoc perlretut
or
perldoc perlre

Paul Lalli

 

Thread Tools
Display Modes





Powered by vBulletin®
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0