Anthony Akens wrote:

> I'm attempting to use the following code to read a file
> in the format of:
> 
> directory name:displayname
> 
> I want to sort the list by the "displayname", looking
> at the first letter for each display name in the file.
> If it's unique, I want to print it.  This should result
> in an alphabetical list of the letters for the display
> names.  However, the sort is not working quite right,
> and I sometimes get letters out of order, missing, or
> some that aren't even in the list.
> 
> Can anyone tell me what I've done wrong?
> 
> Tony
> 
> ---------------------------
> open (NAMES, $namefile)
>     or die "Could not open $namefile $!";
> 
> while(<NAMES>)
> {
>     ($key, $value) = split /:/;
>     chomp $value;
>     $Names{$key} = $value;
> }
> close NAMES;
> 
> foreach $dirname (sort { "\L$a" cmp "\L$b" } keys %Names){
>     $displayname = $Names{$dirname};
>     $item = substr($displayname, 0, 1);
>     push (@alpha, "\U$item") unless $seen{"\L$item"}++;
> }
> 
> print "<P>";
> 
> foreach $letter(@alpha) {
>     print "<A HREF=\"\#$letter\">$letter<\/a> ";
> }
> ----------------------------

if you want to sort by displayname, those are the values of the hash, not 
the keys. you might want to try something like:

#!/usr/bin/perl -w
use strict;

my %Names;
my %Seen;

open(NAMES,$nameFile) || die $!;
while(<NAMES>){
        chmop;
        my($key,$value) = split(/:/);
        $Names{$key} = $value;
}
close(NAMES);

foreach my $value (sort {lc $a cmp lc $b} values %Names){
        next unless($value =~ /(.)/ && !$seen{lc $1}++);
        print "<A HREF=\"#\U$1\">$1</A>\n";
}

__END__

untested. see if the above works better.

david

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

Reply via email to