in reply to how to hash this

Weird. This script is returning multiple instances of each found record in a strange order. The file it is accessing contains only one record for each item. i've tried commenting out almost the whole file, so it must be in the main guts of the thing, cause i can't get rid of the problem. can anyone spot it? also, a strange thing happens, when you scroll down the browser window, the list moves in incrementally towards the right.

#!c:/Perl/bin/Perl -wT use strict;#force us to pre-declare variables use CGI qw/:standard/; print header;#header type is text/html #require "c:/progra~1/apache~1/apache/cgi-bin/getmenu.cgi"; #& java; my $value = "Zen"; my $lfilename = "products.pdg"; open (FILE, $lfilename) or &dienice; my @products; while ( <FILE> ) { if ( /^Begin Product (.*)/i ) { # We have a product starting line my %hash; $hash{ 'prodcode' } = $1; # get the product code. $hash{ 'prodname' } = <FILE>; $hash{ 'prodprice' } = <FILE>; $hash{ 'prodweight' } = <FILE>; my $trackinv = <FILE>; $hash{ 'tracking' } = ( $trackinv =~ /(Yes|No)/i ); my $img = <FILE>; my($img1,$img2)=split(/\|/, $img); $hash{ 'img1'} = $img1; $hash{ 'img2'} = $img2; $hash{ 'prodtext' } = <FILE>; my $line = <FILE>; last if ( $line =~ /End Product/ ); if ( $line =~ /^\s*Begin Option (.*)$/ ) { my $name = $1; my @option_list; while ( <FILE> ) { last if ( /End Option/ ); push @option_list, $_; } $hash{ $name } = \@option_list; } else { #if there is no option, then stick what's in front of the : as the ha +sh name, the rest as it's value my ( $name, $value ) = ( $line =~ /^\s*(.*?):(.*)$/ ); $hash{ $name } = $value; } push @products, \%hash; print "<HTML>"; print "<TABLE ALIGN\= CENTER>"; print "<TR>"; print "<TD>"; foreach my $ref ( @products ) { if ($ref->{prodname} =~ ($value)){ print "<B>"; print $ref->{prodname}; print "</B>"; print "<br>"; print "<IMG SRC\=\"$ref->{img2}\">"; print "<br>"; print $ref->{prodprice}; print "<br>"; print "<a href\=\"shopper\.exe\?preadd\=action\&amp\;key\=$ref->{prodc +ode}\">", "Add to Cart", "</a>"; #print $ref->{prodtext}; print "<br>"; print "<hr>"; }}}} close (FILE); print "</TD>"; print "</TR>"; print "</TABLE>";

Replies are listed 'Best First'.
Re: Re: how to hash this
by chromatic (Archbishop) on Apr 02, 2001 at 10:11 UTC
    The four closing braces after the <hr> tag make me curious, as the first opening curly brace is in the while line.

    I suspect, without testing it, that if you moved two of the right curlies to beneath the push line, you wouldn't be printing the contents of @products for each line of the file.

    Maybe it's the transcription to PM that's making this difficult to read, but I find that a consistent indentation style helps me gauge the flow of code properly. (To be fair, if we were writing this in Python, we wouldn't have the freedom to do otherwise.)

    If you indent each block four or more characters with a tab, it'll be easier to see these things in the future.

      that worked, and i reformatted it. is this the way to do it?:
      #!c:/Perl/bin/Perl -wT use strict;#force us to pre-declare variables use CGI qw/:standard/; print header;#header type is text/html require "c:/progra~1/apache~1/apache/cgi-bin/getmenu.cgi"; & java; my $value = "Angel"; my $lfilename = "products.pdg"; open (FILE, $lfilename) or &dienice; my @products; while ( <FILE> ) { if ( /^Begin Product (.*)/i ) # We have a product starting line { my %hash; $hash{ 'prodcode' } = $1; # get the product code. $hash{ 'prodname' } = <FILE>; $hash{ 'prodprice' } = <FILE>; $hash{ 'prodweight' } = <FILE>; my $trackinv = <FILE>; $hash{ 'tracking' } = ( $trackinv =~ /(Yes|No)/i ); my $img = <FILE>; my($img2,$img1)=split(/\|/, $img); $hash{ 'img1'} = $img1; $hash{ 'prodtext' } = <FILE>; my $line = <FILE>; last if ( $line =~ /End Product/ ); if ( $line =~ /^\s*Begin Option (.*)$/ ) { my $name = $1; my @option_list; while ( <FILE> ) { last if ( /End Option/ ); push @option_list, $_; } $hash{ $name } = \@option_list; } else { #if there is no option, then stick what's in front of the : +as the hash name, the rest as it's value my ( $name, $value ) = ( $line =~ /^\s*(.*?):(.*)$/ ); $hash{ $name } = $value; } push @products, \%hash; } } print "<HTML>"; print "<TABLE ALIGN\= CENTER>"; print "<TR>"; print "<TD>"; foreach my $ref ( @products ) { if ($ref->{prodname} =~ ($value)) { print "<B>"; print $ref->{prodname}; print "</B>"; print "<br>"; print "<IMG SRC\=\"$ref->{img1}\">"; print "<br>"; print $ref->{prodprice}; print "<br>"; print "<a href\=\"shopper\.exe\?preadd\=action\&amp\;key\=$ref +->{prodcode}\">", "Add to Cart", "</a>"; #print $ref->{prodtext}; print "<br>"; print "<hr>"; } } close (FILE); print "</TD>"; print "</TR>"; print "</TABLE>"; print "<br>"; print "<TABLE>";