kevinw has asked for the wisdom of the Perl Monks concerning the following question:

Hi, some of you helped me with my problem by having my input file which has the following data:
name1 1 2 3 4 typex name2 3 4 5 6 typey name3 2 3 3 1 typex name4 5 3 4 2 typez name5 9 8 2 1 typea
and print it into file "outfile" in the following way:
typea name5 9 8 2 1 typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typez name4 5 3 4 2
i'm trying to arrange it differently so that it's printed in the following format:
typex ...... typey ..... typea ..... typez ......
i'm currently using the following code to generate it:
while (<TEMP>) { my @fields = split; my $key = pop @fields; my $line = [@fields]; push @{$data{$key}}, $line; } close TEMP; foreach my $key (sort keys %data); { print "$key\n"; my @lines = @{$data{$key}}; # list of lines, from hash foreach my $line (@lines); { my @fields = @$line; print "%s %d %d %d %s" @fields; } print "\n"; }
anyone have any suggestions as to how to print it in the other format? thanks in advance

Replies are listed 'Best First'.
Re: Working with arrays
by VSarkiss (Monsignor) on Jul 24, 2002 at 15:29 UTC

    Sorry, kevinw. Even after those two additions, I still can't tell the difference between this:

    typea name5 9 8 2 1 typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typez name4 5 3 4 2
    (what you're getting now), and this:
    typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typea name5 9 8 2 1 typez name4 5 3 4 2
    (what you want).

    Do you want to omit the additional newline before your print the key? Just leave out the print "\n"; at the end of the foreach loop.

    Or do you want it to come out in a different order (you have "typex", "typey", "typea", "typez")? Unless you have an explicit list of the order, I don't see what the ordering is.

    Help us to help you. What's the difference between what you have and what you want? Spell it out in painful detail.

      yes, instead of having it come out in the order typea, typex, typey, and typez, i want it to come out in the order of typex,typey,typea,typez

        Alright. The ordering you're getting now is alphabetical, as a result of sort keys %data.

        I can't see an ordering in the series "x", "y", "a", "z". The only way I can see to do that is to define it explicitly, something like this: foreach my $key (qw(typex typey typea typez))

        If there is an order to that series that I'm not seeing, you may be able to capture the logic in a custom sort function. Look up the sort docs for more info.

        HTH

Re: Working with arrays
by vladb (Vicar) on Jul 24, 2002 at 15:08 UTC
    I don't quite understand why your new requirement for output of this format:
    typex ...... typey ..... typea ..... typez ......
    Couldn't match the very thing your code is doing now, that is print data in this format:
    typea name5 9 8 2 1 typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typez name4 5 3 4 2
    You should be more specific in what is it you want to do and how the output should be structured? At this stage, the only thing I see changed in your 'requirements' is the 'type' ordering. However, the new ordering doesn't appear to be alphanumeric. So, do you want some predefined ordering?

    Update: thanks for clarification kevinw, so here goes the code:
    my %types; while (<DATA>) { chop; m/(.*)\s([^\s]+)$/ or next; push @{$types{$2}}, $1; } foreach my $type (keys %types) { print "$type\n"; print "$_\n" for @{$types{$type}}; } __DATA__ name1 1 2 3 4 typex name2 3 4 5 6 typey name3 2 3 3 1 typex name4 5 3 4 2 typez name5 9 8 2 1 typea
    And subsequent output:
    typex name1 1 2 3 4 name3 2 3 3 1 typea name5 9 8 2 1 typey name2 3 4 5 6 typez name4 5 3 4 2
    But even this is really a rewrite of your original code and doesn't do any sorting, especially the way you want it as it doesn't appear to be in proper alphanumerical order.

    _____________________
    # Under Construction
      sorry for the confusion....basically i have a file in this format
      name1 1 2 3 4 typex name2 3 4 5 6 typey name3 2 3 3 1 typex name4 5 3 4 2 typez name5 9 8 2 1 typea
      and i want to print it out into another file in this format
      typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typea name5 9 8 2 1 typez name4 5 3 4 2
Re: Working with arrays
by krujos (Curate) on Jul 24, 2002 at 15:11 UTC
    Can you explain more what you want the dots to mean? or do you just want dots? It looks like the same thing to me.
    Thanks
    Josh
      sorry, this is what i meant
      typex name1 1 2 3 4 name3 2 3 3 1 typey name2 3 4 5 6 typea name5 9 8 2 1 typez name4 5 3 4 2