on Wed, 31 Jul 2002 12:56:17 GMT, [EMAIL PROTECTED] (Connie Chan)
wrote: 

> What I have now is something like this :
> @ID = qw (Foo Bar Blaz Bob);
> @Country = qw (UK US HK HK);
> @Gender = qw (F M M F);

Using parallel arrays to store related data is not a good idea imho.
I would use an (anonymous) array of hashes here:

    my $persons = [ { ID => 'Foo', COUNTRY => 'UK', GENDER => 'F' },
                    { ID => 'Bar', COUNTRY => 'US', GENDER => 'M' },
                    { ID => 'Bla', COUNTRY => 'HK', GENDER => 'M' },
                    { ID => 'Bob', COUNTRY => 'HK', GENDER => 'F' }
                  ];

(I don't believe Bob is female though :-)


> %table{ID} = (ID => \@ID, Country => \@Country, Gender =>
> \@Gender); So I got $table{ID}[1] as 'Bar", and I think this is
> HOA. 

Did you mean %table = (...) here instead of %table{ID} = (...), which 
is a syntax error.

> Note : The above array is always same in dimension, and
> the reading way is Foo's location is in UK and gender is F.

But this is not an array, it is a hash.

> This is fixed, so I can't modify anything on it.

That's a pity, because it really is error-prone.

> But what I going to do is like this :
> my %newTable = SortTable ( TABLE => \%table, Seq => "Gender=A,
> Country=D, ID=A"); 
> my %newTable = SortTable ( TABLE => \%table,
> Seq => "ID=A, Gender=A, Country=A"); # where =A =D is in terms of
> acending and decending order. 

If I understand you correctly, you want to create a new hash, where 
the elements in the individual arrays are sorted by your criteria.
 
> That would really complex if have to write one, so I am looking if
> there is an existed module for this.

Using your datastructure, this would indeed be rather complicated.
If you could use the datastructure I proposed at the beginning of 
this post, you could write

    sub sortit {
        my $array = shift;
        my $code = 'sub sortfun { ';
        my $first = 1;
        
        while (@_) {
            my $s = shift;
            my $d = shift;      
            $code .= ' || ' unless $first;
            $first = 0;
            $code .= $d eq 'A' ?
                     "\$a->{$s} cmp \$b->{$s}" :
                     "\$b->{$s} cmp \$a->{$s}" ;
          }
       $code .= '}';
       undef &sortfun;
       eval $code;
       my @result = sort sortfun @$array;
       return \@result;    
    }

which builds a sortfunction on the fly per your criteria.
It could then be called as follows:

    my $sorted_persons = sortit($persons,  
                                COUNTRY => 'A', 
                                GENDER  => 'D', 
                                ID      => 'A'); 

-- 
felix

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to