[prev in list] [next in list] [prev in thread] [next in thread] 

List:       perl-beginners
Subject:    Re: How to interpolate a hash in a string
From:       David Emanuel da Costa Santiago <demanuel () gmail ! com>
Date:       2015-11-04 18:15:09
Message-ID: 20151104191509.12713445 () gmail ! com
[Download RAW message or body]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256


Thank you all for your replies. I was able to do what i needed. I
changed a bit the conf files syntax:

conf file 1:
option=value
option2=value2

conf file 2:
property=propertyValue
property2=propertyValue2
property3=${option2} #instead of $OPTS{option2}

Read function: 

sub _read_conf_file{
  my $file = shift;

  open my $FH, '<', $file;

  while(my $line = <$FH>){
    chomp $line;
    $line =~ s/\#.*//;
    next if $line =~ /^\s*$/;

    my( $key, $val ) = split(/=/,$line,2);
      
    next if (!defined $val || $val =~ /^\s*$/);
    $key =~ s/^\s+|\s+$//g;
    $val =~ s/^\s+|\s+$//g;
    
    if ($val=~/\$\{.+?\}/) {
      $val =~ s/\$\{(.+?)\}/$OPTS{$1}/g; #This is very interesting! :-D
    }

    $OPTS{$key}=$val;
  }
  close $FH;
}



Thank you all.


On Tue, 3 Nov 2015 19:34:20 -0800
"$Bill" <dbecoll@gmail.com> wrote:

> Re-sending with CC to OP since it didn't make the group.
> 
> On 11/3/2015 14:03, David Emanuel da Costa Santiago wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA256
> >
> >
> > Hello all.
> >
> > I'm trying to interpolate a hash value in a string but i got stuck.
> > I already tried with eval, without any success...
> >
> >
> > I have two conf files in the form
> > conf file 1:
> > option=value
> > option2=value2
> >
> > conf file 2:
> > property=propertyValue
> > property2=propertyValue2
> >
> > I'm loading these files into a hash. But the problem is that i want
> > to access, for example on conf file 2, properties from conf file 1:
> >
> > property3=$HASH{option2}
> >
> >
> > So i'm getting the hash for conf file 2:
> >  
> > %PROPERTIES=(property=>"propertyValue",  property2=>
> > "propertyValue2", property3=> "$HASH{option2}" );  
> >
> > but what i want is:  
> > %PROPERTIES=(property=>"propertyValue",  property2=>
> > "propertyValue2", property3=> "value2" );  
> >
> >
> > this is how i'm reading the files:
> >
> > sub _read_conf_file{
> >    open my $FH, '<', shift @_;
> >    while(<$FH>){
> >      chomp;
> >      s/\#.*//;
> >      /(\S+)\s*=\s*(.+)/;
> >      next if (!defined $1 || !defined $2);
> >      $OPTS{$1}=$2;
> >    }
> >    close $FH;
> > }
> >
> > Does anybody knows how to do this?  
> 
> I would make s simple addition to your syntax to indicate the value
> is to be taken from the first hash using that value as key.  I
> arbitrarily picked '~' to indicate this condition (you could use
> whatever unique marker you want including $HASH and replace my '~'.
> I avoided trying to eval the $OPTS{} in file 2, but you could play
> with that using 2nd version below which accomplishes the same thing
> with eval.
> 
> use strict;
> use warnings;
> use Data::Dumper;
>    $Data::Dumper::Indent=1; $Data::Dumper::Sortkeys=1;
> 
> my $c1 = <<EOD;			# file 1
> option=value
> option2=value2
> EOD
> 
> my $c2 = <<'EOD';		# file 2
> property=propertyValue
> property2=propertyValue2
> property3=~option2		# arbitrary ~ marker
> EOD
> 
> my %OPTS = ();
> 
> _read_conf_file ($c1);
> _read_conf_file ($c2);
> print (Data::Dumper->Dump([\%OPTS], [qw(%OPTS)]));
> exit;
> 
> sub _read_conf_file {		# modified to handle from vrbls
> instead of files my $src = shift;
> 
> # open my $FH, '<', shift @_;
> # while (<$FH>) {
> foreach (split /\s*\n\s*/, $src) {
> 
> 	next if /^\s*#.*/ or /^\s*$/;	# remove blank and
> comment lines
> 
> 	if (not /(\S+)\s*=\s*(.+)/) {
> 		print "Invalid config file syntax ($_)\n"; next;
> 	}
> 
> 	my $k = $1 // ''; my $v = $2 // '';
> 	if (not $k) { print "Missing key ($_)\n"; next; }
> 
> 	if ($v =~ /^~/) {		# if indirect hash assign
> 		$OPTS{$k} = $OPTS{substr $v, 1};
> 	} else {
> 		$OPTS{$k} = $v;
> 	}
> }
> # close $FH;
> 
> }
> 
> __END__
> 
> eval version:
> 
> foreach (split /\s*\n\s*/, $src) {
> 
> 	next if /^\s*#.*/ or /^\s*$/;	# remove blank and
> comment lines
> 
> 	if (not /(\S+)\s*=\s*(.+)/) {
> 		print "Invalid config file syntax ($_)\n"; next;
> 	}
> 
> 	my $k = $1 // ''; my $v = $2 // '';
> 	if (not $k) { print "Missing key ($_)\n"; next; }
> 
> 	$v = eval $v if $v =~ /^\$/;
> 	$OPTS{$k} = $v;
> }
> 

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJWOkstAAoJEJ/OLjwuDYzKg/AH/AiTYpPupOrV9fqKM8xKDO7Q
i/87w3ynwzB6md5y+zmKZqYvoN1r2NocVvvce3nQH9aSdMIwlRfPFyAPUBEaJpnL
Nddcg4N8YktMuo77Ptk6TlluG+Ok3pKPC7F9wyZ8Qh1+CWJLxj5N/KzpJ2Osei5W
E9ZzTyUgwz/KzU3GVIvUdSV2A51v7QeIhdPYmnqQKZwnfKQ3U9APxZ+a8AuYXHSb
3d+bnVidNpRSPvkpXgLqCHQwphpYspj2MhOg9cYAeOJxcidWiPxWP2cbL8g8EN6Z
z5wb4j1SP2iW6/vZkWC2INudRQWktE5FHo8tUJhrxwlRAKYmyVunv/YghTyOhnY=
=yX+d
-----END PGP SIGNATURE-----

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic