From:                   oryann9 <[EMAIL PROTECTED]>
> Greetings, 
> 
> I posted this question on perlmonks and received some great help,
> specifically from mirod but his recent suggestion is still not
> working. 
> 
> 
> Problem: This code only works when I hard-code the size to
> search for in the routine. I try to pass arguments using @_, but it
> does not work. How do I pass $size_input so wanted sees and uses it?
> 
> 
> Mirod's help: 
> 
> You need to pass an additional parameter to wanted. The way to do this
> is to use a closure: File::Find::find({wanted => sub { wanted(
> $size_input); } }, $fs_input ) ;. This way wanted is called by the
> anonymous sub, and gets passed $size_input. 
> See Why I hate File::Find and how I (hope I) fixed it for more info.
> 
> 
> 
> I read the "why i hate...." two and three times and yet still cannot get it 
> to work.
> thank you in advance! 
> http://www.perlmonks.org/?node_id=687008
> 
> 
> use strict;
> use warnings;
> use File::Find;
> 
> my ( @root_files, @large_files, %mounts, @mounts, ) ;
> use vars qw/*name *dir *prune/ ;
> *name   = *File::Find::name ;
> *dir    = *File::Find::dir ;
> *prune  = *File::Find::prune ;
> 
> 
> <snip>
> }
> else {
>     print "USING LAST ELSE\n";
>     my $size_input = ( int 25 * ( 1024**2 ) ) ;
>     $size_input =~ tr /\000//d ;
>     my $wanted =  make_wanted ( \&wanted_1, $size_input ) ;
>     File::Find::find( $wanted, $fs_input ) ;
>     print "\n";
> }
> 
> sub wanted_1 {
> 
>     for my $key ( sort keys %mounts ) {
>         if ( $fs_input eq $key ) {
>             @mounts =
>                 grep {$fs_input} @{ $mounts{$key} } ; ###-- HoA --###
>         }
>     }
> 
>     if ( scalar @mounts > 0 ) {
>         die "cant search...foobarbazzzzy $!" ;
>     }
>     else {
>         my ( $size_input ) = shift @_ ;
>         print $size_input,"\n";
>         my ($dev,$ino,$mode,$nlink,$uid,$gid) ;
>         (( $dev,$ino,$mode,$nlink,$uid,$gid ) = lstat($_) ) &&
>          ( $dev >= 0 ) &&
>          !( $File::Find::prune |= ($dev != $File::Find::topdev ) ) &&
>          ( int(((-s _) + 1023) / 1024 ) > $size_input ) &&
>          push ((@large_files), $name ) ;
>     }
> }
> 
> sub make_wanted {
> 
>     my $wanted = shift ;    # get the "real" wanted function
>     my @args   = @_    ;    # "freeze" the arguments
>     my $sub = sub { $wanted->( @args ); } ;  # generate the anon sub
>     return $sub ;           # return it
> }
> 
> 
> print "\n",scalar @large_files,"\n";
> exit;
> <snip>
> 
> $size_input is being printed correctly/accurately, but nothing in the array. 

If $size_input is printed correcly, them it has been passed to the 
wanted_1 fine and the problem is elsewhere.

The "condition" for the push() looks insanely complex, I bet you made 
a mistake there.

And to tell the truth .. with the number of global variables you have 
I don't understand why didn't you use $size_input as a global 
variable as well.

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


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


Reply via email to