On Wed, 14 Aug 2002, Jose Malacara wrote:

> Hello. I was wondering if there was a way to open a file into a hash? I know 
> this works for arrays, but was wondering if I this could be done for a hash 
> also.
> 
> I have a file called people.data, which contains two colums:
> jose          2
> karen         8
> jason         9
> tracey        1
> 
> 
> Can someone tell me what I am doing wrong here:
> =============================================
> #! /usr/bin/perl -w
> 
> open (INPUT, "<people.data");
> %people = <INPUT>;

By doing this you are reading all the lines of your file into memory.
This statement finally boils down to
%people = ("jose                2\n","karen     8\n"...);

When you do this the list is evaluated 2 elements at a time with the first
element becoming the hash key and the second the value. Finally your hash 
will look this

%people = ( 'jose       9
' => 'karen     8
' ...);

As you can see the odd numbered lines of your file become the hash keys 
and the even numbered lines the hash values.

Take a look at Data::Dumper to see the kind of data structure you have
created. perldoc Data::Dumper

This will do what you want
while (<INPUT>) {
        my @fields = split; # perldoc -f split
        $people{$fields[0]} = $fields[1];
}

> close (INPUT);
> 
> #%people = (
> #        "jose" => '2',
> #        "karen" => '8',
> #        "jason" => '9',
> #        "tracey" => '1'
> #);
> 
> print "The value for jose is $people{jose}\n";
> =============================================
> 
> I expect to return the value of "2", but see the following error instead:
> 
> "Use of uninitialized value in concatenation (.) or string at ./new.pl line 
> 14.
> The value for jose is"

This is because the key jose is not present in your hash and you have 
turned warnings on. This is a good thing and also add this line to the
top your script
use strict;

If you want associate a hash with a file take look at
perldoc -f tie


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to