http://qs1969.pair.com?node_id=129032

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

I was referred to chromatic's SOPW post that gave a beginner's template on writing their first module. I've started in on mine, but I'm noticing that some of the first few fields need a bit more explanation...

The code from chromatic's post starts out with the following:

# Magical export invocation. use Exporter; @ISA = 'Exporter'; @EXPORT_OK = qw(genHeader);

now, I interpreted the EXPORT_OK array to contain the subroutines from the module that would be exported to the script calling it. so, i placed (genHeader) in there. In my "module", I just have:

# Body here. # Will fill in sub genHeader { my $i = shift; print "<VirtualHost $i>\n"; }

However, when I run my code, I receive the Undefined subroutine &main::genHeader error. My mod is called config.pm and its in the current directory as the script. My script's perl call is #!/usr/bin/perl -w -I./

Is there a module howto that I can run off of on top of chromatic's post? Or, if the answer's concise, can someone point out what's wrong with what I have?

humbly -c

Replies are listed 'Best First'.
(ar0n) Re: My first perl module
by ar0n (Priest) on Dec 03, 2001 at 08:20 UTC

    The subroutines in @EXPORT_OK are subroutines that are allowed to be exported. To export them you need to explicitly request them:

    use My::Module qw/genHeader/;

    Either that, or you could add it to the @EXPORT array, in which case it'll get exported automatically.

    Note though that this is generally considered rude.

    [ ar0n -- want job (boston) ]

Re: My first perl module
by chipmunk (Parson) on Dec 03, 2001 at 08:24 UTC
    Refering to the documentation for the Exporter module, we see that the entries in @EXPORT are exported by default, but the entries in @EXPORT_OK are exported only if the calling package asks for them.

    @EXPORT_OK is very useful for limiting namespace pollution. For example, you might have two modules, each of which has a genHeader method. If they both export genHeader by default, only the one imported second will stick. Whereas if they export genHeader on request, you can import the one you know you want and there will be no confusion.

    If you have a lot of entries in @EXPORT_OK, you can create a tag to allow someone to import a bunch of methods/variables without having to list them all. See Exporter and perlmodlib for more.

Re: My first perl module
by Beatnik (Parson) on Dec 03, 2001 at 18:33 UTC
    h2xs can generate stubs for you with a clean skeleton. Something like h2xs -X -n My::Module will do the trick, and yes, @EXPORT is in it too :)

    Greetz
    Beatnik
    ... Quidquid perl dictum sit, altum viditur.
      h2xs creates a whole lot of stuff. It's very useful, I'd imagine, to the person who created it, but not for me (or a lot of other people). I write a ton of modules, and I've never once wanted to use it. Ever.

      ------
      We are the carpenters and bricklayers of the Information Age.

      Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

        I like h2xs for it's POD stubs and it's Makefile.PL stub. I'm lazy, what can I say? :))

        Greetz
        Beatnik
        ... Quidquid perl dictum sit, altum viditur.
Re: My first perl module
by Zaxo (Archbishop) on Dec 03, 2001 at 12:03 UTC