http://qs321.pair.com?node_id=217285


in reply to Re: Re: Fetching unique owner name
in thread Fetching unique owner name

Hi,

Sorry, I (wrongly) assumed you were an advanced Perl monk. I'll explain my solution step by step:

my ( @temp, %authors ); @temp = sort map { my @b=split; $b[2]; } `ls -l /path/to/authors`;
(NB: note the added path, I forgot that in my original answer!)
You should read this from right to left: each line of the output of the ls command is split and a map is created of each second element (ie. the user names). The array returned by map is sorted and assigned to @temp.
The array @temp now contains all authors of the files in your directory, including doubles!

foreach ( @temp ) { $authors{$}=1 if not $authors{$_} and length $_; }
This will loop through @temp and make a hash with the author names as key. The value is only stored if it doesn't exists already and has a length of > 0.
I do this to ensure the hash only contains unique names.

print "$_\n" for keys %authors;
This loops through the keys of the hash %authors and prints them. To get an array of the unique authors of the files in your directory you would do something like my @unique_authors = keys %authors;

Hope this helps,

-- JaWi

"A chicken is an egg's way of producing more eggs."

Replies are listed 'Best First'.
Re: Re^3: Fetching unique owner name
by Anonymous Monk on Dec 03, 2002 at 18:55 UTC
    Thanks for all the help.

    This works except I keep getting these error messages along with output:
    Use of uninitialized value at per2.pl line 5. Use of uninitialized value at per2.pl line 5. Use of uninitialized value at per2.pl line 8. Use of uninitialized value at per2.pl line 8. smith rogers richards
    Here is the script:
    #!/usr/local/bin/perl -w use strict; my ( @temp, %authors ); @temp = sort map { my @b=split; $b[2]; } `ls -l /directory/pth/here`; foreach ( @temp ) { $authors{$_}=1 if not $authors{$_} and length $_; #I had to add $_ because the other way "$authors{$}=1" gave me an erro +r } print "$_\n" for keys %authors;
      Hi,

      Of course! Your right! I should stop coding Perl from the head and use the interpreter instead. If I tested it first, I would have come to the following code:

      ... @temp = sort map { ( split )[ 2 ]; } `ls -l /directory/pth/here`; foreach( @temp ) { $authors{$_}=1 if not $authors{$_} and length $_; } ...
      Indeed, I made a little typo in my previous solution, $authors{$} had to be $authors{$_};

      -- JaWi

      "A chicken is an egg's way of producing more eggs."

        Thanks, now I just have to sort it and I will be okay. Again thanks for all your assistance!