Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Use module questions..

by kiat (Vicar)
on Apr 20, 2003 at 03:17 UTC ( #251768=perlquestion: print w/replies, xml ) Need Help??

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

Hi Monks,

I'm new to using modules and have a couple of questions regarding the following code. Note that I've included the main script named power.cgi and the module named Test.pm.
#### Begin main script power.cgi #!/usr/local/bin/perl use strict; use CGI qw(:standard); #use lib '/httpd/cgi-bin/module'; use lib '.'; #use Test; #use Test qw(&power); use Test qw($hello_away &power); my $hello_here = 'hello world from here'; # Call power in Test.pm my $value = power(4); print header, start_html('Using Module'), "<p>$hello_here</p>", "<p>$hello_away</p>", "$value", end_html, ; #### End of main script #### Begin module Test.pm package Test; use strict; use base 'Exporter'; our @EXPORT = qw($hello_away); our @EXPORT_OK = qw(&power); our $hello_away = 'hello world from away'; sub power { my $var = shift; $var *= $var; return $var; } 1; #### End module
My questions are:

1) What is the difference between specifying use lib '/httpd/cgi-bin/module'; and use lib '.';?

2) It seems I have to have either two use statements use Test; and use Test qw(&power); or just this one use Test qw($hello_away &power);. Which is the preferred method?

3) How can the code be improved?

Thanks in anticpation =)

Replies are listed 'Best First'.
Re: Use module questions..
by Beatnik (Parson) on Apr 20, 2003 at 06:12 UTC
    Another note is that Test already exists as name, so you are always forced to use lib if you want to use it. I suggest another temporary name, preferably something that doesn't have the same name from any module from the core dist :)

    Greetz
    Beatnik
    ... I'm belgian but I don't play one on TV.
Re: Use module questions..
by pfaut (Priest) on Apr 20, 2003 at 03:35 UTC

    '/httpd/cgi-bin/module' is an absolute path. It always refers to the same place. '.' is a relative path. If you run the script from a different directory, you won't find your modules.

    @EXPORT is what gets exported if the user doesn't request a different export list. If you know what you want exported, specify it explicitly as in your second example instead of relying on the module maintainer to not change @EXPORT.

    90% of every Perl application is already written.
    dragonchild
      Thanks, pfaut!

      So if power.cgi is in a different directory from Test.pm, I should use '.', right?

      And if I want to make the subroutine 'power' available automatically in the main script (i.e. power.cgi), I should include it in our @EXPORT = qw(&power $hello_away);, right?

      If I do that, then I won't need the @EXPORT_OK array. Please let me know if I understood you correctly =)
        No - the other way round - if power.cgi is in a different directory to Test.pm, you'll need an absolute path to it ("/httpd/whatever/") or a relative path that will find it ("../../httpd/whatever"). pfaut's point is that if you use a relative path, and then move script.cgi to *somewhere else*, the relative path won't work, so you're probably safer using an absolute path.

        You've sussed it about @EXPORT and @EXPORT_OK though. :)

        Cheers
        Ben.

        '.' means the process's current working directory which may or may not be the directory containing the script or the directory containing the module. If you want to make sure you find your modules, use absolute paths.

        The whole idea of namespaces (packages) is to avoid accidentally redefining routines and variables when you use a module. When you export names from a module, you have removed this protection barrier. It's better to use @EXPORT_OK and let the user decide which names to import than to use @EXPORT and force it on him.

        This isn't such a big deal if you're writing both the module and the program that uses it but if you're writing the module for someone else to use it might become an issue. They may not be aware of all of the names you listed in your @EXPORT array. If one of those names clashes with a name they are already using, they may get unexpected behaviour.

        Remember, the user can always get to the routines and variables in the package by specifying the full package name, e.g., $PackageName::PackageVar. Providing it through an export only allows the user to use a shorthand notation.

        90% of every Perl application is already written.
        dragonchild

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://251768]
Approved by lacertus
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (8)
As of 2021-05-12 20:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Perl 7 will be out ...





    Results (132 votes). Check out past polls.

    Notices?