Perdeep,

I think this code should do what you are looking for:

# retool your data into something more usable, a hash of arrays
foreach $key (keys %Values) {
    # split the values for the key
    @values = split(/\s/, $Values{$key});

    foreach $val (@values) {
        # set this value in an array at it's own index
        ${$parsedData{$key}}[$val] = $val;

        # set the high odd number
        if ($val % 2 == 1 && $val > $hiOdd) {
            $hiOdd = $val;
        }

        # set the high even number
        if ($val % 2 == 0 && $val > $hiEven) {
            $hiEven = $val;
        }
    }
}

# output the reworded data
foreach $key (sort keys %parsedData) {
    print "$key   ";
    # print out the odd values
    for ($i=1; $i<=$hiOdd; $i+=2) {
        if (defined ${$parsedData{$key}}[$i]) {
            print " ${$parsedData{$key}}[$i],";
        } else {
            print "  0,";
        }
    }
    print "    ";
    # print out the even values
    for ($i=2; $i<=$hiEven; $i+=2) {
        if (defined ${$parsedData{$key}}[$i]) {
            print " ${$parsedData{$key}}[$i],";
        } else {
            print "  0,";
        }
    }
    print "\n";
}


Matt

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of
Mehta, Perdeep
Sent: Monday, April 09, 2007 8:40 AM
To: perl-unix-users@listserv.ActiveState.com
Subject: [Perl-unix-users] printing hash values in a special order

Hi,

I have a hash with even numbers followed by odd numbers as values that I
want to print in a certain order. I have tried my self several hours but
couldn't work this out. Here is an example of input data. I will
appreciate any help.

%Values has following fields,
name(Key) bands(Values)
143B    08
2A5E    06 10
2AAA    10 12 07 09
2ABA    02 06 13
ABCA    07
ABC8    02
ABC2    10 11
ABCB    10
ABC1    08 10 07 09
ABC2    01 03
ABC5    06 01
ACH3    06
ACHA    04 08 01 05 09 11
ACLA    10
ACM4    03
ACTA    10 13
ACTB    02 06 08 20 01 03 07 11 13
ACTY    02 09 11
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The output should look like this. 
All odd numbers first followed by even numbers and wherever a value is
missing print 0(zero). For example,
Name                Odd bands                 Even bands
          01, 03, 05, 07, 09, 11, 13,    02, 04, 06, 08, 10, 12
====      ==========================     ======================

143B      0,  0,  0,  0,  0,  0,  0,     0,  0,  0, 08,  0,  0
2A5E      0,  0,  0,  0,  0,  0,  0,     0,  0, 06,  0, 10,  0
2AAA      0,  0,  0, 07, 09,  0,  0,     0,  0,  0,  0, 10, 12
2ABA      0,  0,  0,  0,  0,  0, 13,    02,  0, 06,  0,  0,  0
ABCA      0,  0,  0, 07,  0,  0,  0,     0,  0,  0,  0,  0,  0
ABCB      0,  0,  0,  0,  0,  0,  0,    02,  0,  0,  0,  0,  0
ABCC      0,  0,  0,  0,  0, 11,  0,     0,  0,  0,  0, 10,  0
.
.
And so on ....
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Note: Top three lines are to make the output example clearer.


Thanks,
perdeep

Perdeep Mehta
Hartwell Center for Bioinformatics & Biotechnology
St. Jude Children's Research Hospital
Memphis, TN 38105

_______________________________________________
Perl-Unix-Users mailing list
Perl-Unix-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
_______________________________________________
Perl-Unix-Users mailing list
Perl-Unix-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to