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


in reply to Fetching unique owner name

Hi,

update: Actually tested the code and refined it a bit...
update2: Crafted a better perl solution, not calling perl in Perl...

Couldn't you just do something like:

my ( @temp, %authors ); @temp = sort map { my @b=split; $b[2]; } `ls -l`; foreach ( @temp ) { $authors{$}=1 if not $authors{$_} and length $_; } print "$_\n" for keys %authors;'
IIRC, uniq is a standard unix command, which is also available under Solaris 7.

Greets,

-- JaWi

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

Replies are listed 'Best First'.
Re: Re: Fetching unique owner name
by Anonymous Monk on Dec 03, 2002 at 14:52 UTC
    HOw would this work? Am I in the right direction??
    @temp = '/mydirectory/directory'; my ( @temp, %authors ); @temp = sort map { my @b=split; $b[2]; } `ls -l`; foreach ( @temp ) { $authors{$}=1 if not $authors{$_} and length $_; } print "$_\n" for keys %authors;'
      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."

        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;