Scott Palmer wrote:
> I am attempting to sort by a field in a hash within a hash and I am
> having a hard time finding the right direction. I want the print out to
> sort from smallest to largest in size. Any help would be greatly
> appreciated. 
> 
> ------------------------------------------
> #!/usr/bin/perl

The second and third lines of your program should be:

use warnings;
use strict;

> # Set your size/time requirements
> $minsize = 50;          # Expressed in Megabytes
> $maxtime = 90;          # Expressed in days
> 
> # Define modules we need
> use File::Find;
> use Time::Local;
> 
> # Get defined inputs and convert them to something we can use
> $nosmaller = ($minsize * 1024);
> $nonewer = ($maxtime * 86400);
> $time = timelocal($seconds, $minutes, $hours, (localtime)[3,4,5]);      

You haven't defined the variables $seconds, $minutes and $hours anywhere?

> $timecomp = ($time - $nonewer);                                         
> 
> %tmp = ();
> # setup temp hash
> $count = 0;

You are using a numerical index so you should probably use an Array of Hashes
instead of a Hash of Hashes.

> sub wanted {
>         my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
>                 $size, $atime, $mtime, $ctime,) = stat($_);
>         if ($atime < $timecomp) {

Instead of using the file's atime you could use the -A operator which is the
file's atime in days.

>                 if ($size > $nosmaller) {
>                         $count++;
>                         my $filename = $File::Find::name;
>                         my ($name) = getpwuid($uid);

No need for list context there.

>                         my $osize = ($size / 1024 / 1024);
>                         $tmp{$count}{owner} = $name;
>                         $tmp{$count}{size} = $osize;
>                         $tmp{$count}{file} = $filename;
>                 }
>         }
> }
> 
> File::Find::find({wanted => \&wanted}, @ARGV);
> 
> # Print out hash table
> for $count ( keys %tmp ) {
>         printf "%10s %12.2f MB $tmp{$count}{file} \n",

Ouch!  Putting interpolated variables in a printf format string is risky and
should be avoided.

>                 $tmp{$count}{owner}, $tmp{$count}{size};
> }
> exit;

You probably want something like:

#!/usr/bin/perl
use warnings;
use strict;

# Set your size/time requirements
my $minsize = 50;          # Expressed in Megabytes
my $maxtime = 90;          # Expressed in days

# Define modules we need
use File::Find;

# Get defined inputs and convert them to something we can use
my $nosmaller = $minsize * 1024;

my @tmp;
sub wanted {
    my $owner = getpwuid( ( stat )[ 4 ] );
    return if $maxtime   > -A _;
    return if $nosmaller > -s _;

    push @tmp, {
        owner => $owner,
        size  => ( -s _ ) / 1024 / 1024,
        file  => $File::Find::name,
        };
}

find( { wanted => \&wanted }, @ARGV );

# Print out hash table
for my $hash ( sort { $a->{ size } <=> $b->{ size } } @tmp ) {
    printf "%10s %12.2f MB %s\n", @{ $hash }{ qw( owner size file ) };
}

exit 0;

__END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to