http://www.perlmonks.org?node_id=863205


in reply to Re: Command-line arguments to command-line Perl
in thread Command-line arguments to command-line Perl

Thanks for the response, NetWallah!

This is, indeed, Linux. Rather than escape-character woes, I think the problem I'm facing is because everything after the -e <program code> switch is treated as an input file (and not an argument to the Perl program itself).

In my code example, I would like $ARGV[0] to contain a certain value (ADCIF, in this case):

perl -pi -e '$design = $ARGV[0] ; s/.*'def'.*''/\t"def" => "dumper\/$design.def",/g' ConfigFile $tcsh_input

This code should behave like so:

perl -pi -e '$design = "ADCIF" ; s/.*'def'.*''/\t"def" => "dumper\/$design.def",/g' ConfigFile

Here, I am trying to provide "ADCIF" to the perl script on-the-fly (which is why I need the argument to be contained in @ARGV).

I apologize if my initial question was unclear. Please let me know if you have any other suggestions.

~RecursionBane

Replies are listed 'Best First'.
Re^3: Command-line arguments to command-line Perl
by morgon (Priest) on Oct 03, 2010 at 23:04 UTC
    I think you don't really understand what -p does.

    I recommend that you read about it in "perldoc perlrun".

    In your example you seem to expect that "ConfigFile" is treated as the name of the file that -p workes on and all the other command-line arguments go to @ARGV.

    This is wrong.

    What happens is that ALL arguments (including "ConfigFile") go to @ARGV but then are treated (via -p's magic) as filenames. This is why you get the error.

    So you have to pass your data to perl via some other mechanism if you want to use -p (I would use an environment variable).

      Yes, you're right. I didn't quite understand what -p did. Thanks for your suggestion regarding perldoc! I have a better understanding of how -p and -i work. Also, -s seems interesting.
Re^3: Command-line arguments to command-line Perl
by suhailck (Friar) on Oct 04, 2010 at 01:11 UTC
    This seems to be working
    cat test 1 2 3 4 5 perl -pe 'BEGIN{$prefix=pop;}s/(\d+)/$prefix.$1/' test A A.1 A.2 A.3 A.4 A.5

      Thank you, suhailck!

      This tactic worked for me; I'd never have thought to use BEGIN() to stall the argument preprocessor until specific args could be gathered before allowing the program to proceed (and thereby still keeping the ability to auto-parse all supplied files "in-line")!

      This is what my one-liner now looks like:

      perl -pi -e 'BEGIN {$design = pop}; s/'def'.*''/\t"def" => "dumper\/$design.def",/g' ConfigFile ADCIF

      The main advantage here is that I can supply "ConfigFile1 ConfigFile2 ... ConfigFileN ADCIF" (or, indeed, "ConfigFile* ADCIF") to have the change applied to all of them. Thanks again for your solution!

      ~RecursionBane