in reply to Array insertion problem

I think it is breaking because you are printing every time you read in three lines, not every time you get three lines that you actually parse.

In the first three lines, you only parse the first one. At that point your array contains three pieces of information, ( ["llp", 1], ["Up", 5], [0, 6] ), the first time you print. It sorts them properly; you just don't have all the data yet. I suspect you are missing an else { next } in that block of elsifs.

That said, I feel compelled to tell you that your code is horrid. If I knew how to say it nicely, I would. If I was expected to maintain that, I would not hesitate to write it over again from scratch, all the while cursing your name. Frankly, I don't even know where to tell you to begin improving it. I think you should just scrap what you have and rethink your approach. You are almost certainly better off just parsing all of the data into a single data structure and then producing your report afterwards.

-sauoq
"My two cents aren't worth a dime.";

Replies are listed 'Best First'.
Re: Re: Array insertion problem
by kirk123 (Beadle) on Dec 11, 2002 at 01:55 UTC
    I agree it is horrible. But can you be so kind as to enlighten me on a better way of doing it.
      I think a HoH would make this problem a lot easier on the eye, so I offer a little example code, which does not print stuff out in the order you want, but hopefully gets you off in a slightly better direction:
      #!/usr/perl/bin use strict; my %printer_hash; my $current_printer; while(<DATA>) { if (/^printer/) { my ($idle, $enabled); ($current_printer,$idle,$enabled) = (split)[1,3,4]; $printer_hash{$current_printer}{IDLE_STATUS} = $idle eq "idle"?0:1 +; $printer_hash{$current_printer}{ENABLED} = $enabled eq "enable +d"?"UP":"DOWN"; } elsif ( /Interface:(.+)/i ) { chomp; $printer_hash{$current_printer}{INTERFACE} = (split /\//, $_)[ +-1]; } elsif ( /Description: (.+)/i) { $printer_hash{$current_printer}{INTERFACE} = $1; } elsif ( /Connection: (.+)/i) { $printer_hash{$current_printer}{CONNECTION} = $1 eq "direct"?"loca +l":"remote"; } elsif (/Banner not required/) { $printer_hash{$current_printer}{BANNER} = "NO"; } } foreach my $printer ( keys %printer_hash ){ foreach my $item ( keys %{$printer_hash{$printer}} ) { print "$printer => $item: $printer_hash{$printer}{$item}\n"; } } __DATA__ printer llp is idle. disnabled since Wed Oct 23 15:54:08 GMT 2002. ava +ilable. Form mounted: Content types: any Printer types: unknown Description: OPENprint printer llp Connection: direct Interface: /usr/lib/lp/model/standard On fault: write to root once After fault: continue Users allowed: (all) Forms allowed: (none) Banner not required Character sets: (none) Default pitch: Default page size: Default port settings: -opost printer ps is idle. enabled since Wed Oct 23 15:54:17 GMT 2002. availa +ble. Form mounted: Content types: postscript, simple Printer types: unknown Description: local printer Connection: direct Interface: /usr/lib/lp/model/net_lj4x On fault: write to root once After fault: continue Users allowed: (all) Forms allowed: (none) Banner not required Character sets: (none) Default pitch: Default page size: Default port settings:
      Note that I have not thoroughly checked it, but by printing out the items in the HoH, you can put them in any order you would like, and have a good idea what is getting printed when instead of having to re-read your code and try to remember which part of the array you are printing in what location, etc.

      -enlil