Something I just found via a google search...

foreach (@_) {
        $min = $_ if $min > $_;
}

$min now holds the smallest value of the array.

BTW, shouldn't line 21 be write $fileref STDOUT? I've not gone over the
code, but if you are looking for the smallest array value, then only writing
out once that's been found I'd guess you were trying to write out that
value.

John

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: 11 January 2002 16:58
To: [EMAIL PROTECTED]
Subject: Help with File::Find


Hi Everyone!

I'm fairly new to Perl, and completely new to submitting to the list, so
please be easy on me.  :-)

The purpose of the code I wrote (listed below) is to go through the current
directory and all of its subdirectories and report the filename, size and
age of the x largest files, where x depends on the argument supplied on the
command line and the number of files in the directory.  I'm sure there's an
easier way to do this with a UNIX utility (or with Perl), but this program
has been a good learning experience for me.

The code below runs without any syntax errors, but File::Find (which I love
and use frequently) or the -e file test doesn't give the results I expect.
Specifically, my (explicit) checks show that the test in line 11 does not
always evaluate to TRUE for values of $_ corresponding to legitimate (i.e.,
existing and size > 0) files, which means I'm missing files that should be
in my final output.  If I change line 11for debugging purposes to simply

if ($_){

all files (including the previously missed ones) are printed out (also
along with the directories now) as expected, but for the files that would
not have passed the (-e $_) test, the values assigned for filesize and age
in line 12 are (tested to be) undefined.  If this is any help, the files
that don't pass the (-e $_) of test of line 11 are (perhaps coincidentally)
the biggest files (~55 GB)  in the directory.

I've researched the File::Find documentation and checked the FAQ's with no
luck, so I'm hoping someone out there can help me.

Also, is there a function that returns a minimum value in an array?  It's
not my biggest concern right now, but it would make line 20 simpler.

 1: #!/usr/local/bin/perl -w
 2:
 3: use Cwd;
 4: use File::Find;
 5: use FileHandle;
 6:
 7: ($filecount = shift) || ($filecount = 20);
 8:
 9: sub wanted{
10:  my $flag = 0;
11:  if (-e $_){
12:   push(@filelist, [$File::Find::name, -s $_, -M $_]);
13:    }
14:  }
15:
16: $dir = cwd();
17:
18: find(\&wanted,$dir);
19:
20: foreach $fileref ((sort {$b->[1] <=> $a->[1]} @filelist)[0..(sort( {$a
<=>$b} $filecount,scalar(@filelist)-1))[0]]){
21:  write STDOUT;
22:  }
23:
24: STDOUT -> format_name("STDOUT_BOT");
25: write STDOUT;
26:
27: format STDOUT_TOP=
28: FILENAME
FILE SIZE (BYTES)  AGE (DAYS)
29:
----------------------------------------------------------------------------
--------------------------------------
30: .
31: format STDOUT=
32:
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<< 

>>>>>>>>>>>>>>>>    @>>>
33: $fileref->[0], $fileref->[1], sprintf("%4.0f", ($fileref->[2]))
34: .
35: format STDOUT_BOT=
36:
----------------------------------------------------------------------------
-------------------------------------
37: .
...


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


--------------------------Confidentiality--------------------------.
This E-mail is confidential.  It should not be read, copied, disclosed or
used by any person other than the intended recipient.  Unauthorised use,
disclosure or copying by whatever medium is strictly prohibited and may be
unlawful.  If you have received this E-mail in error please contact the
sender immediately and delete the E-mail from your system.



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

Reply via email to