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 ;
>
>
>
> }
> 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...foobarbay $!" ;
> }
> 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;
>
>
> $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/