On Tue, 18 Mar 2003, Scott R. Godin wrote: > John W. Krahn wrote: > > > David Gilden wrote: > >> > >> OK, one problem is solved, which was the path to the data file. > >> I know there is a simple way to read in a file like the following: > >> > >> apple,2 > >> banana,4 > >> kiwi,1 > >> > >> and produce a HASH. The code below works I get the feeling there is a > >> more compact way to accomplish this. > > > > Yes, there is. :-) > > > > my %hash = do { local $/; <FH> =~ /[^\n,]+/g }; > > Holy Handgrenades, Batman! > > but where's the implicit split of key and value there? forgive me for > asking, but I just don't see it. is there some magic going on here?
Step 1) local $/ $/ (input record separator) defines what constitutes a line in perl. By default it is set "\n". The statement "local $/" undefines $/ within this do block i.e. you are now operating in slurp mode. perldoc perlvar # Search for INPUT_RECORD_SEPARATOR Step 2) <FH> =~ /[^\n,]+/g Remember you are in slurp mode, so a <FH> would return the string "apple,2\nbanana,4\nkiwi,1\n". The regex matches anything that is not a ',' or "\n" and thus performing the split for you. The do block returns the value of the last statement, in this case the result of the regex in a list context due to the my %hash = do {...} The returned list is ('apple', 2, ....) which gets assigned to %hash and everybody is happy :-) hth -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]