Harry Putnam wrote:
> 
> I posted here a while back about how to set the parameters of an
>   s/// type of action, inside a script from the cmdline.
> 
> Paul posted a simple script in answer that does exactly that.
> and even allows any modifier to be set from cmdline.
> (Slightly modified for clarity)
> 
> cat example1.pl
>   #!/usr/bin/perl -wp
>   BEGIN { our($regex,$repl,$mod) = (shift,shift,shift||'') }
>   eval "s/$regex/$repl/$mod";
> 
> Results:
>   echo something|./example1.pl '(some)(.*$)' '$1one'
>   someone
> 
> Paul explained in brief how and why this works but I'm having trouble
> integrating this into a more complex script, can't seem to find the
> error of my attempts.
> 
> The script is awfully contrived but the idea is to get this to work
> in a script employing Getopts::Std or other complications.
> 
> In the example below the input is expected to come from files so I
> dropped the -p part.
> 
> In this contrived  case the input file contains only the one line
> 
>   something
> 
> I know my script is wrong but have tried a number of variations.  All
> failed.  Its apparent I'm lacking some basic knowledge about eval here.
> 
> With a command line like:
>  ./example2.pl  -s '(some)(.*$)' '$1one'
                                    ^^^^^
That won't work because it be interpreted as the variable $1one instead
of the variable $1 followed by the string 'one'.  You need to put parens
around the variable name like this:

./example2.pl  -s '(some)(.*$)' '${1}one'


> cat example2.pl
> 
>  #!/usr/local/bin/perl -w
> 
>  $file = "./input";
> 
>  use vars qw($opt_s);
>  use Getopt::Std;
>  my $optstr ="s:";
>  getopts($optstr);
> 
>  if ($opt_s) {
>    $regex = $opt_s;
>    BEGIN {
>     our ($repl,$mod) = (shift,shift||'')
>    }

You are not using either the -p or -n switch so you don't need this in a
begin block.

>  }
> 
> open(FILE,"<$file") or die;

You should include the $! variable in the error message so you know WHY
it failed.

> # NOW how to use eval here
> while(<FILE>){
>     chomp;
> # how can I make these variables be seen as a legitimate piece
> # of perl code?  And print the result
> # eval $_ =~ s/$regex/$repl/$mod;
> # print...
> }

Your substitution operator will work like this:

    s/(?$mod:$regex)/qq("$repl")/ee;
    print;

The /ee does the eval but just on the replacement half, not the whole
expression.



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to