http://qs1969.pair.com?node_id=774349


in reply to Re: a REFERENCE of array of hashes
in thread a REFERENCE of array of hashes

Hi guys,I have tried to work out the answers but the code seems have quiet a few error.I've tried this to create a reference array of hashes:
use strict; use warnings; use Data::Dumper; my $data = "members.dat"; open (DAT, $data) or die "\"$data\" not existed or can't be opened!\n" +; my @client; my @fields = qw/memberno firstname lastname subjuct score/; while (<DAT>) { next if ( /^Surname/ or /^-/ ); my @values = unpack 'A15A15A15A15A15', $_; my %entry = map { $fields[$_] => $values[$_] } ( 0..$#fields ); push @client, \%entry; }
I am worndering whether @client I've created is a reference array of hashes? or is it a real array of hashes.

Replies are listed 'Best First'.
Re^3: a REFERENCE of array of hashes
by why_bird (Pilgrim) on Jun 24, 2009 at 13:41 UTC
    Also, printf is your friend for printing with specific formatting (like limiting to 15 chars).
    why_bird
    ........
    Those are my principles. If you don't like them I have others.
    -- Groucho Marx
    .......
Re^3: a REFERENCE of array of hashes
by why_bird (Pilgrim) on Jun 24, 2009 at 13:38 UTC

    I haven't got too much time so a couple of points to start with.

    Learn regular expressions. I mean it. They look like a mess to begin with, but I promise, they're SO useful. I don't really use pack/unpack, so this isn't definitive, but I think they're usually used for 'weird' characters and formatting, or manipulating bits. Well, I'm sure many people will argue with 'usually' and tbh, if they can enlighten me on the matter, it'd be useful..!

    A quick tip to get you going:

    my $text="fakeemail@somewhere.com"; $text =~ /(.+?)@(.+?)/; print "$1, $2"; -------------- fakeemail, somewhere.com
    =~ is the regex operator. the groups, indicated with brackets () that you match show up in the variables $1 and $2.

    For comma separated values, I would also recommend that you use 'split' as I mentioned before. It's much easier and if the format of your fields change, it won't screw up your program.

    @client is an array. A real array. You know it's a real array because you declared it 'my @client'.

    \%entry is a hash reference. So you've made an array of hash references. I'm not sure really what they mean by a 'reference array of hashes' but I would interpret it in the way that you have.

    why_bird
    p.s. I haven't tested the snippets of code here or below, just so you know!
    ........
    Those are my principles. If you don't like them I have others.
    -- Groucho Marx
    .......
      Thank you so much for you help. Your hints are very useful. Since I only start learning Perl for the last 2 weeks I dont really know which is the best way to do certain work. Now I can focuse on split to try to work out the answer.
Re^3: a REFERENCE of array of hashes
by Anonymous Monk on Jun 24, 2009 at 11:37 UTC
    And also what I found confusing is I dont know how to read from a file, modify it and then save it in a new file. Eg. above I unpack the data in to 15 charactor each, push them into an array of hashes. now I want to write them into a new data file with the new fomat. How should I do this?

      You need to specify a 'mode' when you use open. This means that you specify whether you want to read from or write to a particular file (you can do both, but you don't need that for now).

      use strict; use warnings; my $INPUT; my $OUTPUT; open($INPUT, "<", "my_input_file.txt"); #the "<" tells it you want to +read from the file open($OUTPUT, ">" "my_output_file.txt"); #the ">" tells it you want to + write to the file. while(my $line=<$INPUT>){ #.. do some changes to $line .. print $OUTPUT $line #prints $line (after I've done whatever chang +es) to the file I opened as $OUTPUT }

      check out here for some more info on filehandles. Also bear in mind that you can either not declare a filehandle, and just use a plain text word, e.g.  open(INPUT,"<","input_file.txt); or you can declare a variable as I did in the example above. IMO it's a better habit to get into to use a variable, as you start to get into trouble when/if you try to pass filehandles around subs (later..!)

      hope this helps.
      why_bird
      ........
      Those are my principles. If you don't like them I have others.
      -- Groucho Marx
      .......