Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: conf file in Perl syntax

by LanX (Saint)
on Jun 11, 2009 at 11:03 UTC ( [id://770599]=note: print w/replies, xml ) Need Help??


in reply to conf file in Perl syntax

If you are new to perl probably you don't want starting installing modules...

There is a poor man's solution for evaluating configfiles as scripts with do

this works with your example:

our $config; do './conf.pl' or die "Can't read config $!"; print $config->{host_1};

or even more error proved described in the docs with

# read in config files: system first, then user for $file ("/share/prog/defaults.rc", "$ENV{HOME}/.someprogrc") { unless ($return = do $file) { warn "couldn't parse $file: $@" if $@; warn "couldn't do $file: $!" unless defined $return; warn "couldn't run $file" unless $return; } }

BE AWARE: do searches the @INC directories, so better use a path to avoid problems...

Cheers Rolf

UPDATE: As I wrote the config-file is evaluated as script not parsed as data, so be aware of necessities of securing this code! If it's just a one way script, and you have full control it's ok. If you mean to write a full scale program for others, better use a config-module.

Replies are listed 'Best First'.
Re^2: conf file in Perl syntax
by afoken (Chancellor) on Jun 11, 2009 at 11:23 UTC

    Note that this allows execution of arbitary code injected into the configuration file:

    $config = { host_1 => '192.168.1.1', host_2 => '192.168.1.2', host_3 => '192.168.1.3', host_4 => '192.168.1.4', you_will_have_a_really_bad_day => `rm -rf /`, }

    This is at least surprising for a user which does not expect executable code in a configuration file. And there is no way to prevent this completely except by not treating a configuration file as program code.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
Re^2: conf file in Perl syntax
by Ravendark (Acolyte) on Jun 11, 2009 at 11:25 UTC
    Thanks LanX for your reply. I am new guy in perl, but I installed the IniFiles module. what you are writing is hard-to-read syntax for me. What I need is a little code snippet that does the following: I have the inifile:
    [hosts] # hostname = IP host_1 = 192.168.1.1 host_2 = 192.168.1.2 host_3 = 192.168.1.3
    The only thing I need is a little piece of code that will get all the hostnames into an array @hostnames and all the IPs into an array @ips. Is this possible? Thank you!

      Don't do that (parallel arrays). Either use an array of arrays (AoA):

      my @IPMap = ( [ "host_1", "192.168.1.1" ], [ "host_2", "192.168.1.2" ], [ "host_3", "192.168.1.3" ], );

      or better, a hash:

      my %IPMap = ( host_1 => "192.168.1.1", host_2 => "192.168.1.2", host_3 => "192.168.1.3", );

      YAML allows both structures to be generated directly from the configuration file. For example:

      use strict; use warnings; use Data::Dump::Streamer; use YAML (); my $yamlStr = <<END_YAML; --- host_1: "192.168.1.1" host_2: "192.168.1.2" host_3: "192.168.1.3" --- - - host_1 - "192.168.1.1" - - host_2 - "192.168.1.2" - - host_3 - "192.168.1.3" END_YAML my ($IPMapH, $IPMapAoA) = YAML::Load ($yamlStr); Dump $IPMapH; Dump $IPMapAoA;

      Prints:

      $HASH1 = { host_1 => '192.168.1.1', host_2 => '192.168.1.2', host_3 => '192.168.1.3' }; $ARRAY1 = [ [ 'host_1', '192.168.1.1' ], [ 'host_2', '192.168.1.2' ], [ 'host_3', '192.168.1.3' ] ];

      True laziness is hard work
      $ cat hosts.conf
      <Hosts>
      host_1 = 192.168.1.1
      host_2 = 192.168.1.2
      host_3 = 192.168.1.3
      </Hosts>

      $ cat hosts.pl

      #!/usr/local/bin/perl -w
      use Config::General(ParseConfig);
      $configFile='hosts.conf';
      my %config = ParseConfig($configFile);
      foreach my $host (keys(%{$config{Hosts}}))
      {
      print "Machine : $host => $config{Hosts}{$host}\n";
      }

      $ ./hosts.pl
      Machine : host_1 => 192.168.1.1
      Machine : host_2 => 192.168.1.2
      Machine : host_3 => 192.168.1.3

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://770599]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (7)
As of 2024-04-19 13:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found