in reply to Re: call perl subs in another directory?
in thread call perl subs in another directory?

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.
  • Comment on Re^2: call perl subs in another directory?

Replies are listed 'Best First'.
Re^3: call perl subs in another directory?
by gamache (Friar) on Oct 17, 2007 at 13:58 UTC
    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
        are you sure Data1.pl has a 'package XXXX;' line, where XXXX is not used as a package name anywhere else? It sounds like one (or more) of the files you're doing is using either a package name that's used elsewhere, or is not supplying a package name (thereby reverting to package 'main').

        If you still have problems, make your files look more like my examples. ;)

        -pete