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

So I have an array of lines from a file that contains email addresses. Some of the lines have only email addresses like "MGORBA@kremvax.ru", while some of the lines have other info like "MGORBA@kremvax.ru (Lucille Ball)".

I want to sort the array so that the longer lines sort to the top, so that an array like

MGORBA@kremvax.ru
and if I ever catch MGORBA@kremvax.ru sniffing my under-
MGORBA@kremvax.ru (Lucille Ball)
so that it comes out
and if I ever catch MGORBA@kremvax.ru sniffing my under-
MGORBA@kremvax.ru (Lucille Ball)
MGORBA@kremvax.ru
Is there a smarter way to do this than
$length = length($scalar); $store{$length} .= "$scalar\n"; for ( sort $b <=> $a ( keys ( %store ))) { print "$store{$_}"; }
which seems needlessly messy. Is there something simpler? -clay

Replies are listed 'Best First'.
Re: Sorting @ary by line length?
by Big Willy (Scribe) on May 25, 2001 at 00:39 UTC
    This ought to do it. $b and $a represent the actual elements of the array and we just call length() on them.
    @sorted = sort { length($b) <=> length($a) } @unsorted;
      Mikhail Gorbachev, Lucille Ball, and I all thank you.

      -clay

(bbfu) (smarter?) Re: Sorting @ary by line length?
by bbfu (Curate) on May 25, 2001 at 06:49 UTC

    Well, I don't really know what you mean by "smarter" (I thought, at first, that you meant more efficient or, perhaps, with less bugs than your version but then you go on to say that your version is "needlessly messy" which makes me wonder...) but, except for the bug where any two lines that happen to have the same length would get concatenated together, yours was close to being pretty efficient. Perhaps you'd like the Schwartzian Transform?

    @arr = ('medium', 'longest of all', 'short'); @sorted = map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [$_, length] } @arr; print "$_\n" for @sorted;

    Of course, that's perhaps also "needlessly messy," since Big Willy's version certainly will work, albeit perhaps a little more slowly (depends on how many lines you're sorting and what order they're in).

    *shrug* HTH

    bbfu
    Seasons don't fear The Reaper.
    Nor do the wind, the sun, and the rain.
    We can be like they are.

      "The Transform" makes sense only when the function is expensive to compute. Last time I looked, length wasn't all that expensive. {grin}

      -- Randal L. Schwartz, Perl hacker