Mark.Allan has asked for the wisdom of the Perl Monks concerning the following question:

I know this is usualli a big NO NO but Im reposting a post I posted last night because I missed critical information out

The link to the orginal post is here ----------->

http://www.perlmonks.com/?node_id=1053560

The part I missed out was related to question 1. I need only the values between {} for DEPLOY_PARAMS and not the entire string, this obvuously put a different complexion on things because values are not static

Any assistance would be much appreciated

  • Comment on Regex random values pattern match and code efficiency

Replies are listed 'Best First'.
Re: Regex random values pattern match and code efficiency
by hdb (Monsignor) on Sep 12, 2013 at 14:00 UTC

    Trying to understand your question: In the first post you were told how to find the right hand side of DEPLOY_PARAMS=$DOMAIN{HOST},$DOMAIN{IP},$DOMAIN{CONFIG} and now you want to extract what's within the braces? Like this:

    use strict; use warnings; my $str='$DOMAIN{HOST},$DOMAIN{IP},$DOMAIN{CONFIG}'; my @result = $str =~ /{(.+?)}/g; print "@result\n";

    Update: Putting it all together:

    use strict; use warnings; use Data::Dumper; my %h = map {my($k, $v)=/^(.*?)=(.*)/; $v=[ $v=~/{(.+?)}/g ] if $v=~/} +/; $k=>$v } <DATA>; print Dumper \%h; __DATA__ DEPLOY_TIME=300 DEPLOY_TYPE=OS DEPLOY_PARAMS=$DOMAIN{HOST},$DOMAIN{IP},$DOMAIN{CONFIG} DEPLOY_DEFAULT_STARTUP=$DOMAIN{STARTUP.INI} DEPLOY_DEBUG=Y DEFAULT_EXPIRY=900

      Yes, extract values which are in braces only BUT the same values will not be there every time, for example, another file will only contain the following

      DEPLOY_PARAMS=$DOMAIN{HOST},$DOMAIN{IP}

      Or

      DEPLOY_PARAMS=$DOMAIN{HOST}

      For example, the values could change in every file so its not static mapping

        Well, I encourage you to run my proposed code on all kinds of test data to see how it fares. You might also try to understand how it works to see that it does not care what exactly there is. As you will see there is no sign of a static mapping.

        One thing I would propose is to add a filter for lines without equal sign to make it more robust:

        my %h = map {my($k, $v)=/^(.*?)=(.*)/; $v=[ $v=~/{(.+?)}/g ] if $v=~/} +/; $k=>$v } grep {/=/} <DATA>;