in reply to call perl subs in another directory?

It looks like you want to be using do. Here's a short example, in three files.

In do-test.pl:

#!/usr/bin/perl use strict; use warnings; while (<subdir/*.pl>) { do $_; } Foo::spew(); Bar::spew();
In subdir/foo.pl:
package Foo; print "Executing foo.pl\n"; sub spew { print "This is package Foo\n"; }
In subdir/bar.pl:
package Bar; print "Executing bar.pl\n"; sub spew { print "This is package Bar\n"; }
Finally, the output of do-test.pl:
Executing bar.pl Executing foo.pl This is package Foo This is package Bar
(Edited to provide more instructive example)

Replies are listed 'Best First'.
Re^2: call perl subs in another directory?
by guthrie (Novice) on Oct 17, 2007 at 02:06 UTC
    Very nice, thanks - but this assumes that I have known (fixed) files and asociated package names. I need dynamic. I need in the file loop to be able to call a display() method on each file (or package) found.
      Tricky! But there's a way (and probably more than one). do returns the value of the last evaluation in the file; this means we can stick __PACKAGE__ at the end of the file and then grab this value with do.

      In do-test2.pl:

      #!/usr/bin/perl use strict; use warnings; while (<subdir/*.pl>) { my $pkg = do $_; print "Loaded package $pkg\n"; { no strict 'refs'; &{"${pkg}::spew"}(); } }
      In subdir/foo.pl:
      package Foo; print "Executing foo.pl\n"; sub spew { print "This is package Foo\n"; } __PACKAGE__
      subdir/bar.pl is similar to subdir/foo.pl, as above.

      Output of do-test2.pl:

      Executing bar.pl Loaded package Bar This is package Bar Executing foo.pl Loaded package Foo This is package Foo
      Dynamic.
        Very cool! Thanks.
        But I do notice that I get errors on (only) the first "do",
        Subroutine display redefined at sources/Data1.pl line 8.

        for each sub defined in the data files.
        Greg