Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

package inside .pl

by bugsbunny (Scribe)
on Dec 02, 2002 at 12:42 UTC ( [id://216900]=perlquestion: print w/replies, xml ) Need Help??

bugsbunny has asked for the wisdom of the Perl Monks concerning the following question:

hi,

I have xxx.pl the content of which is something like this :
#!/usr/bin/perl
package XX::Blah;
... code...

1;
package main;
use XX::Blah;
my $x = new XX::Blah();
$x->method();
It seems that it can't find XX::Blah 'cause it is is not in some of the @INC directories but within the script itself...
How can I make it work ?
Note: it is .pl not .pm

thanx alot in advance

Replies are listed 'Best First'.
Re: package inside .pl
by jreades (Friar) on Dec 02, 2002 at 12:54 UTC

    Because that would be... illogical, captain.

    There is a good logical reason for not embedding packages inside a script file (such as, modules are supposed to be re-usable, but they certainly aren't when they're embedded in a script), but there are also some syntactic issues that you'll run into. (Aside: there is a good reason for being able to embed scripts in a module -- test cases.)

    If I remember correctly, use expects a .pm file (there may be some way to override this, but I don't know it). So when you say use XX::Blah perl goes looking for XX/Blah.pm in all of the directories included in @INC (which usually includes '.'). I doesn't matter that the package is defined in that script, Perl doesn't know to look for it there because it's not a .pm file. You might be able to futz around with require, but I seriously doubt that that will improve things for you.

    I tried this little test:

    package Foo; sub test { return "test"; } 1; package main; use Foo; print STDOUT Foo::test(); exit 0;

    No dice. I even played around with package main::Foo just to make sure, but still no dice.

    But if you place package Foo in the file Foo.pm then the script compiles perfectly and prints out "test" before exiting.

    Alternately, if you remove the use then you can do what you want as follows:

    package Foo; sub test { return "test"; } 1; package main; print STDOUT Foo::test(); exit 0;

    HTH

Re: package inside .pl
by BrowserUk (Patriarch) on Dec 02, 2002 at 12:56 UTC

    The problem is that the line use XX::Blah; is instructing Perl to search for a file Blah.pm located in a subdirectory XX within one of the library subdirs described by %INC.

    To use a package that is included in the current source file, you don't need to ask Perl to find it for you, it already knows where it is. So don't use it, just use it :).

    #! perl -slw use strict; package XX::Blah; sub new { return bless { proof=>'You got me!' } , shift; } sub proof { my $self = shift; print $self->{proof}; } package main; my $test = new XX::Blah; $test->proof(); __END__ # Output C:\test>216900 You got me! C:\test>

    Okay you lot, get your wings on the left, halos on the right. It's one size fits all, and "No!", you can't have a different color.
    Pick up your cloud down the end and "Yes" if you get allocated a grey one they are a bit damp under foot, but someone has to get them.
    Get used to the wings fast cos its an 8 hour day...unless the Govenor calls for a cyclone or hurricane, in which case 16 hour shifts are mandatory.
    Just be grateful that you arrived just as the tornado season finished. Them buggers are real work.

Re: package inside .pl
by rdfield (Priest) on Dec 02, 2002 at 12:51 UTC
    Take out the 'use' statement.

    rdfield

Re: package inside .pl
by broquaint (Abbot) on Dec 02, 2002 at 13:58 UTC
    How can I make it work ?
    Since a use is essentially just a require and import, and the package is already within the file you just need to call the import method on that package, and if it doesn't have an import method, then there's nothing left to do. But if it does then it would go something like this
    { packge Foo::Bar; ... } Foo::Bar->import
    And because import is somewhat special it's ok to call it even if the package hasn't defined it.
    HTH

    _________
    broquaint

Re: package inside .pl
by bugsbunny (Scribe) on Dec 02, 2002 at 13:02 UTC
    thanx ... yep i know about reusing :"), just this way is easier for editing until i get things working...

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://216900]
Approved by diotalevi
Front-paged by tye
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (2)
As of 2024-04-25 01:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found