http://qs321.pair.com?node_id=466835


in reply to Extracting non-consecutive but related items from an array.

This is just the thing hashes exist for:

#Untested use strict; my %data; #assume file is opened as <INPUT> while (<INPUT>) { chomp; my ($server,@apps_info)=split /,/; push @{$data{$server}}, \@apps_info; } foreach my $server ( keys %data ) { print "$server\n\t"; for ( @{$data{$server}} ) { print join " ", split /,/; print "\n\t"; } }

Basically, pull all of the data into a hash with the server name as keys.

Update: Updated as per Tomtom's remark

CU
Robartes-

Replies are listed 'Best First'.
Re^2: Extracting non-consecutive but related items from an array.
by Tomtom (Scribe) on Jun 15, 2005 at 08:59 UTC
    Isn't it supposed to be $server instead of $_ ?
      Isn't it supposed to be $server instead of $_ ?

      Yup - that's why it says #Untested :). Thanks!

      CU
      Robartes-

      Yes, I think its $server too....Thanks guys.

      But, Can I have simple breakup of this code?
      print $_, $/, map { "\t@$_$/"} @{$clean_data{$_}} for sort keys %clean_data;
      And, why did we have to reference \ @apps_info? couldn't we use it without referencing?
      Blackadder
        And, why did we have to reference \ @apps_info? couldn't we use it without referencing?

        No particular reason, it's just that that's the way I like doing things. This way, the information contained in one line in the input file stays readily identifiable (it's one element of the array for that server), whereas pushing on the first level array would result in a flat list. But it's just a preference thing, I guess.

        CU
        Robartes-

        $/ is the The input record separator, newline by default (see the perlop man page; type perldoc perlop and find it). The code you posted could be re-written like this:
           foreach my $key (sort keys %clean_data) {
             print $key, $/;
             foreach my $data (@{$clean_data{$key}}) { 
            # the hash value $clean_data{$key} is an array reference
            # wrapping it in @{} gives us the array it references.
            # this array contains array references, 
            # so @$data gives us an array
                print "\t", @$data, $/;
             }
           }
        
        - Dotan