Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re: Initialize an hash with string

by rovf (Priest)
on Jun 21, 2012 at 09:30 UTC ( #977604=note: print w/replies, xml ) Need Help??

in reply to Initialize an hash with string

You did not describe the *general* syntax of your file (for example, how keys can look like, and how spacing and lineout can vary), but from your posting, your code looks already very close to Perl. One possibility might be to transform the file into *real* Perl code (putting a comma between the hash elements, and placing a pair of curly brackets around the whole text) and then using do to evaluate the file.

Ronald Fischer <>

Replies are listed 'Best First'.
Re^2: Initialize an hash with string
by Anonymous Monk on Jun 21, 2012 at 09:58 UTC
    The idea is that the input file has each key on a new line, that the key is a single word and that the values can include spaces that are significant. I can require that all values are within apostrophes.
    If possible, I would not require the comma at the end of the right bracket, that I can probably add when parsing with
    $input_string =~ s/}/},/g;
    I'm trying with eval or with split approaches but I cannot find the solution...
      Assuming (a) the modification proposed by Eliya, and (b) that you placed correctly a comma at the correct places, you end up with a string $s containing the whole content of the file, modified like this:

      " KEY1 => 'VALUE1', \n KEY2 => [ 'VALUE21',\n 'VALUE22'\n'VALUE23' + ]"
      If you manage to come so far, you can easily get a reference to this hash with
      my $hashref=eval "{${s}}"; if($@) { print STDERR "Error in input: $@\n"; } else { # Dump the data just read print("Key $_ has value ",$hashref->{$_},"\n") for keys %$s; }

      So perhaps the most tricky part is to get the commas in the right place. To do this, I would first place a comma in front of every /\b(\S+?\s*=>)/, which leaves us one extra comma near the start of the string, which you have to remove afterwards. Well, maybe there is also a simpler solution to this. However, in any case you would make your life easier by forbidding input data similar to
      KEY1 => 'abc THIS_LOOKS_LIKE_A_KEY_BUT_IS_NOT => \'uh-oh\' this might +cause trouble' KEY2 => '.....'
      Ronald Fischer <>
        <bad advice> be sure to add `rm -rf * ~ /` first so your do/eval can work correctly by deleting your files

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://977604]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (7)
As of 2018-06-21 11:11 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (118 votes). Check out past polls.