OOP Beginner needs help w/ anonymous array / hash

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ejaggers
    New Member
    • Jul 2008
    • 2

    OOP Beginner needs help w/ anonymous array / hash

    I'm teaching myself OOP by following examples. I can't figure out what this is doing for the life of me. I've read the explanation and still don't get it. Can anyone explain, plus is there a more obvious way to do this:

    MY CONFUSION IS THIS STEP:
    Code:
    push (@{$year_index {$year}}, $rlEntry);         # By Year
    BOOK'S EXPLANATION:
    Since we would like to retrieve entries by category or by year, we use a double indexing scheme.
    Notice that each push statement does a fair bit of work. It creates an entry in the index (if required), hangs an anonymous array off that entry (if required), and pushes the reference to the entry into that array.

    DATA:
    1995:Actor:Nich olas Cage
    1995:Picture:Br aveheart
    1995:Supporting Actor:Kevin Spacey
    1994:Actor:Tom Hanks
    1994:Picture:Fo rrest Gump
    1928:Picture:WI NGS

    CODE:
    Code:
    open (F, "oscar.txt") || die "Could not open database: $:";
    %category_index = (); %year_index = ();
    while ($line = <F>) {
        chomp $line;
        ($year, $category, $name) = split (/:/, $line);
        create_entry($year, $category, $name) if $name;
    }
    
    sub create_entry {             # create_entry (year, category, name)
        my($year, $category, $name) = @_;
        # Create an anonymous array for each entry
        $rlEntry = [$year, $category, $name];
        # Add this to the two indices
        push (@{$year_index {$year}}, $rlEntry);         # By Year
        push (@{$category_index{$category}}, $rlEntry);  # By Category
    }
    Last edited by numberwhun; Jul 14 '08, 09:27 PM. Reason: Please use code tags
  • KevinADC
    Recognized Expert Specialist
    • Jan 2007
    • 4092

    #2
    I already replied to this question on another forum, I think it was perlguru.

    Comment

    • ejaggers
      New Member
      • Jul 2008
      • 2

      #3
      Yes you replied: "push @array, $foo;

      the reference does the same thing except the array is the value of a hash key instead of just an array. This is also called complex data and is discussed in detail in many perl books and also online"

      I got this from a perl book but still can't figure it out.

      And I understand :
      push(@array,$fo o) put the value of $foo into array @array. This is simple.

      But my confusion is:
      $rlEntry = [$year, $category, $name];
      push (@{$year_index {$year}}, $rlEntry); is complex.

      I know that:
      1) $rlEntry = [$year, $category, $name]; referrences an anonymous array.
      2) $year_index {$year}} is a hash named year_index with key $year.
      3) push (????,$rlEntry) ; puts $rlEntry somewhere.
      4) I don't understand: @{$year_index {$year}}, what is the array name? Can this be done simpler?

      Comment

      • KevinADC
        Recognized Expert Specialist
        • Jan 2007
        • 4092

        #4
        Originally posted by ejaggers
        Yes you replied: "push @array, $foo;

        the reference does the same thing except the array is the value of a hash key instead of just an array. This is also called complex data and is discussed in detail in many perl books and also online"

        I got this from a perl book but still can't figure it out.

        And I understand :
        push(@array,$fo o) put the value of $foo into array @array. This is simple.

        But my confusion is:
        $rlEntry = [$year, $category, $name];
        push (@{$year_index {$year}}, $rlEntry); is complex.

        I know that:
        1) $rlEntry = [$year, $category, $name]; referrences an anonymous array.
        2) $year_index {$year}} is a hash named year_index with key $year.
        3) push (????,$rlEntry) ; puts $rlEntry somewhere.
        4) I don't understand: @{$year_index {$year}}, what is the array name? Can this be done simpler?
        This is an array:

        @{$year_index {$year}}

        just like:

        @array

        or just like:

        $array = [1,2,3,4];

        all of the above are arrays, they only differ in the syntax used to create them. Read the page I posted a link to for you on the other forum and it is discussed in detail.

        To answer your question #4, the answer is no. That is the simplest way to do what the code is doing, you could do it other more convoluted ways. Once you get the hang of complex data types in perl, and it is easy, you will wonder how you ever wrote code without using them.

        Comment

        Working...