in reply to Changing parameters

You mean, is there a one-liner to update a value in such a file? Sure.

# one way to do it. Changes "$i = 2" to "$i = 20". perl -lpi.bak -e 'BEGIN { ($var, $val) = @ARGV; @ARGV = qw/parameter.p +h/ } s/^(my \$$var =).*/$1 $val;/' i 20

(This is untested.) You also get a free backup file named parameter.ph.bak .

By the way, any reason you're using the ".ph" extension?

Replies are listed 'Best First'.
Re^2: Changing parameters
by sparkel (Acolyte) on Nov 29, 2004 at 16:39 UTC
    Hi,

    Thanks for the response.

    Yes, I basically need a one-liner to change one or many parameters in the parameter.ph file from the command-line.

    The reason I am using a .ph extension is because this was strictly a parameter file and I kind of saw something similar online.

    Is there a better way of having a parameter file in perl?

    Thanks.

      My offering only changes one setting at a time.

      Yes, there is something better, but what it is exactly depends on how complex your parameters are, what kind of validations you'll want to be doing on them, and so on. But the baisic thing about configuration is that if they are in a data file, you can give them to someone who isn't familiar with Perl syntax for editing and they have less chance of breaking things if they leave off a semicolon somewhere.

      Very often INI-style config files win over thanks to their simplicity. Take a look over at CPAN -- they have plenty of modules that handle this format. My personal favorite is Config::Tiny, but shop around. (If your config data is flat, for example, you might not like Config::Tiny's "_" level.)

      For more complex data — long text, arrays, maps and so on — YAML is a nice choice. It also has a Perl module to handle it. See if you like it better! (Some people dislike its sensitivity to indentation.)

        Hi gaal,

        Thanks for those suggestions. That is exactly the reason I had the parameter file, so that other people don't need to open up the script files inorder to change values. Also, all the parameters used in different scripts can be found in one place. I'll look up those modules you have suggested.

        I did try your script and it only changes one variable. Please tell me how I can change both i and j (and many more) at one go in the command line.

        Thanks.