On Sun, Nov 23, 2008 at 17:55, Harry Putnam <[EMAIL PROTECTED]> wrote:
> The program I'll post below is really only a test of a subroutine I
> want to use in a larger program.  Trying to get the subroutine ironed
> out in this test script below so there is a little extra bumping
> around to get it executed as sub routine, but It fails with these
> errors:
>
>  Variable "$rgx" will not stay shared at ./test line 30.
>  Global symbol "$finddir" requires explicit package name at ./test line
>  19.
>  Execution of ./test aborted due to compilation errors.
>
> I don't understand why that happens.
>
> ------- 8< snip --------
>
> #!/usr/local/bin/perl
>
> use strict;
> use warnings;
>
> my $flag = shift;
>
> checkfile($flag);
> sub checkfile {
>  use File::Find;
>  use File::MMagic;
>  use FileHandle;
>
>  my ($rgx,$use,@finddir);
>  $use = shift @_;
>  $rgx = qr/(^|:)$use /;
>  @finddir = "/usr/portage/profiles";
>
>  find(\&wanted, @finddir) or die "   Failed to open
>  finddir <$finddir>: $!";
>  sub wanted {
>    my ($mm,$res,$testfile);
>    $testfile = $_;
>    $mm = new File::MMagic;       # use internal magic file
>    $res = $mm->checktype_filename($testfile);
>    if ($res =~ /^plain\/text/) {
>      open(FILE,"<$File::Find::dir") or die "Can't open <$File::Find::dir>: 
> $!";
>    }
>    while(<FILE>) {
>      if (/$rgx/) {
>         print "  $File::Find::dir\n";
>         print "  $_\n";
>       }
>     }
>   }
>  }

It looks like your problem is that you are creating a named subroutine
inside another.

I think this is close to what you desire.

#!/usr/local/bin/perl

use strict;
use warnings;

use File::Find;
use File::MMagic;

my $flag = shift;

checkfile($flag);

sub checkfile {
        my $use     = shift;
        my $rgx     = qr/(?:^|:)$use /;
        my @finddir = qw(/usr/portage/profiles);
        my $mm      = File::MMagic->new;

        find(
                sub {
                        my $file = $File::Find::name;
                        my $res  = $mm->checktype_filename($file);
                        if ($res =~ m{^text/plain}) {
                                open my $fh,"<", $file
                                        or die "Could not open $file: $!";
                                while (<$fh>) {
                                        if (/$rgx/) {
                                                print "$file\n";
                                                last; #don't read the rest
                                        }
                                }
                        }
                },
                @finddir
        );
}

-- 
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.

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


Reply via email to