in reply to sorting according to greek alphabet in roman letters

I've never really understood anonymous subroutines, or inline subroutines, which is what you usually do with sort. But I imagine I should create a named subroutine that returns 1,0 or -1 according to my own criteria as listed above, am I right?

You are right there. Create a sub that when given any 2 atoms, returns 1 if the first is larger than the second, 0 if they are equal, or -1 if the first is smaller than the second, for whatever definition of larger, equal and smaller you are using. (Note: use $a and $b for the first and second atom given to the sub, as in my example below).

As for the inline/anonymous subs for sort, they are fairly simple. For example if you had:

sub foo { return $a cmp $b } my @sorted = sort foo @unsorted;
You could replace it with:
my @sorted = sort { return $a cmp $b } @unsorted;
or even:
my @sorted = sort { $a cmp $b } @unsorted;
as a sub implicitly returns the value of the last statement evaluated.

That's pretty much all there is to using an anonymous sub with sort. Of course, if you are using the same sort in more than 1 place, it would be better to make a named sub, that way you only have to change 1 thing if you decide to sort differently later.

Replies are listed 'Best First'.
Re: Re: sorting according to greek alphabet in roman letters
by seaver (Pilgrim) on Oct 01, 2003 at 19:25 UTC
    Ok, I think I understand a bit more now, but ive got more questions if you dont mind

    OK, where do $a and $b come from, are they implicit within 'foo' or are they from 'sort' itself.

    I ask because I have a slight OO problem, $a and $b in my case are actually unique reference numbers to atoms in: $self->{'atoms'}.

    The function I do the sort in is in the same object and has '$self' defined, but if the 'foo' function resides in the same object, how do I pass $self, or else access the object's hash in order to access the atom objects themselves...

    In other words, in foo, I really need to do this:

    sub foo { return $self->{'atoms'}{$a}->atomName cmp $self->{'atoms'}{$b}->ato +mName; } my @sorted = sort foo @unsorted;
    Any pointers?
    Cheers
    Sam