shift, push, hash references, array references

From: William Martell (willmartell_at_yahoo.com)
Date: 04/30/04


To: "Charles K. Clarkson" <cclarkson@htcomp.net>, <beginners@perl.org>
Date: Fri, 30 Apr 2004 12:08:16 -0500

Hello All.

I have a question about this procedure. I am trying to extract these 12
values of text from a text file. I am trying to get my first two hash
values and this is the procedure that handles that. Thanks Charles for all
your help and mentoring. I appreciate your time and consideration. When I
comment out the "shift @fields;"
in CODE1 and run it, I get the results at RESULT1. When I comment out the
"#push @fields; #, ( '' ) x ( 4 - @fields );" in CODE2, I get RESULTS2.

My question is why? What is happening in these lines of code. I dont
understand why you need "my $line = shift;" or what this is doing? I
understand what is happening up until "shift @fields" to the end of the sub
procedure.

What I am trying to get is RESULT3 below. Any pointers on where I can find
information on shift, and push @fields, ( " ) x ( 4 - @fields );
I would like to learn what this is doing and how to get the result I want.

Thanks All.

William Martell

[CODE1]
sub line1fields {
    my $line = shift; #why do I have to shift here. I don't understand
what this is doing.
 # collapse all spaces
    $line =~ s/\s//g;
    my @fields = split /AdNumber:|DatePosted:/, $line;

    # delete extra first field
    #shift @fields; #why do you have to delete this extra first field.
WHere is it coming from??

    # pad missing fields
    push @fields, ( '' ) x ( 4 - @fields );
    return @fields;
}
[/CODE1]

[RESULT1]
"ad_number","date_posted","contact","telephone","email","address","mapsco","
financial_terms","sq_ft","income_property","price","description"
"","5141","","","","","","","","","",""
"","5050","","","","","","","","","",""
"","5038","","","","","","","","","",""
"","5037","","","","","","","","","",""
"","5003","","","","","","","","","",""
"","4998","","","","","","","","","",""
"","4988","","","","","","","","","",""
"","4987","","","","","","","","","",""
[/RESULT1]

############################################################################
#############

sub line1fields {
    my $line = shift;
 # collapse all spaces
    $line =~ s/\s//g;
    my @fields = split /AdNumber:|DatePosted:/, $line;

    # delete extra first field
    shift @fields; #why do you have to delete this extra first field. WHere
is it coming from??

    # pad missing fields
    #push @fields; #, ( '' ) x ( 4 - @fields );
    return @fields;
}

"ad_number","date_posted","contact","telephone","email","address","mapsco","
financial_terms","sq_ft","income_property","price","description"
"","04/19/2004","","","","","","","","","",""
"","04/06/2004","","","","","","","","","",""
"","04/04/2004","","","","","","","","","",""
"","04/04/2004","","","","","","","","","",""
"","03/29/2004","","","","","","","","","",""
"","03/28/2004","","","","","","","","","",""
"","03/27/2004","","","","","","","","","",""
"","03/27/2004","","","","","","","","","",""

############################################################################
####################################

[RESULT3]
"ad_number","date_posted","contact","telephone","email","address","mapsco","
financial_terms","sq_ft","income_property","price","description"
"5141","04/19/2004","","","","","","","","",""
"5050","04/06/2004","","","","","","","","",""
"5038","04/04/2004","","","","","","","","",""
"5037","04/04/2004","","","","","","","","",""
"5003","03/29/2004","","","","","","","","",""
"4998","03/28/2004","","","","","","","","",""
"4988","03/27/2004","","","","","","","","",""
"4987","03/27/2004","","","","","","","","",""
[/RESULT3]

############################################################################
####################################

I could also really use help understanding why and how you use "%$ad", and
"@$ad". Any PERLDOC pointers here would also be appreciated.

My understanding of these is the they both refer to the context of the data.
But beyond that I am confused.

foreach my $value ( values %$ad ) {

return join ',', @$ad{ @field_order };