Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Initialize an hash with string

by rovf (Priest)
on Jun 21, 2012 at 09:30 UTC ( [id://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 <ynnor@mm.st>

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 <ynnor@mm.st>
        <bad advice> be sure to add `rm -rf * ~ /` first so your do/eval can work correctly by deleting your files

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2024-04-19 07:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found