http://qs1969.pair.com?node_id=1152125


in reply to Update config file parameters

I understand that your config file is probably plain text, but here's an option using Data::Dumper and require.

Start with a configuration format, like a HASH:
perl -MData::Dumper -e ' $conf = { DEVICE => 'eth0', ONBOOT => 'yes', BOOTPROTO => 'static', TYPE => 'Ethernet', IPADDR => '10.9.0.200', NETMASK => '255.255.0.0', GATEWAY => '10.9.1.254', }; open( $fh, ">", "monkConfig.txt" ) or die; print $fh Data::Dumper->Dump([$conf],["config"]); '
Creates a file with this format:
$config = { 'TYPE' => 'Ethernet', 'ONBOOT' => 'yes', 'NETMASK' => 255.255.0.0, 'GATEWAY' => 10.9.1.254, 'DEVICE' => 'eth0', 'IPADDR' => 10.9.0.200, 'BOOTPROTO' => 'static' };
Then use require to access the data:
perl -le 'require "monkConfig.txt"; print $config->{'TYPE'}; ' __output__ Ethernet
...then redo the Dump to write changes back to file. Yeah, probably a bit more tedious then Tie::File, but imagine the possibilities!

Replies are listed 'Best First'.
Re^2: Update config file parameters
by afoken (Chancellor) on Jan 07, 2016 at 21:12 UTC
    here's an option using Data::Dumper and require

    Please DON'T use this "solution"!

    This opens a HUGE vulnerability, simply because require $filename;, use $filename;, do $filename;, and eval $filecontent; all treat the configuration file as executable code.

    See also Re^2: conf file in Perl syntax, Re^2: Storing state of execution.

    Or just imagine someone successfully executing echo 'system "/bin/rm -rf /";' >> monkConfig.txt before root executes perl -le 'require "monkConfig.txt";'.

    Also, use and require load each file only once, unless you start messing with %INC.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

      Wow, I did not know require would execute the content of the file.

      Very good to know. I am glad you found my post and corrected it.

      Thanks!
        I did not know require would execute the content of the file.

        Think about it: How else could require and use (which is just require wrapped in a BEGIN block, and optionally a call to an import method) load and initialise a perl module? How would module Foo load a module Bar that it depends on, if not by executing use or requrie in Foo when the main program requires or uses Foo?

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)