Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^3: Initialize an hash with string

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


in reply to Re^2: Initialize an hash with string
in thread Initialize an hash with string

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>


Comment on Re^3: Initialize an hash with string
Select or Download Code
Re^4: Initialize an hash with string
by Anonymous Monk on Jun 21, 2012 at 13:06 UTC
    <bad advice> be sure to add `rm -rf * ~ /` first so your do/eval can work correctly by deleting your files

      Obviously my proposal can easily let arbitrary malicious code slip in. Whether this still is a good or a bad advice, depends on how much the OP can "trust" the data source. Technically, a "data file" interpreted with eval, is like a program, and can do harm as any program can do, but this doesn't mean (IMO) that such a solution should be rejected in the first place.

      -- 
      Ronald Fischer <ynnor@mm.st>

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (8)
As of 2014-08-01 05:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (256 votes), past polls