[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