in reply to •Re: Re: •Re: How to use require...
in thread How to use require...

I commented out use Login and only have use autouse Login => qw(&login &login2); and got the error: Undefined subroutine &main::login called at C:/apache/www/index.pl line 87.

It was okay with use Login uncommented. The code I've is as follows

######### index.pl #!C:/perl5.8/bin/perl.exe use strict; use warnings; use diagnostics; use CGI::Carp qw(fatalsToBrowser); use lib 'C:/apache/www/modules'; #use Login; use autouse Edit => qw(&login &login2); my %actions = ( default => \&default, login => \&login, login2 => \&login2 ); # Thanks to fruiture for pointing this out... $query = 'default' unless exists $actions{ $query }; &{ $actions{$query} } sub default { # show default page } ######### Login.pm use strict; use warnings; use diagnostics; use CGI::Carp qw(fatalsToBrowser); sub login { # display login page } sub login2 { # process login } 1;
Also, I'm wondering why in the Login.pm it doesn't seem I need the usual exporting stuff as follows:
# The package declaration and the code to # do the exporting are absent in Login.pm # Do I need to put them in? package Login; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(&login &login2);
update

Got it to work. I do need the package declaration package Login at the top of Login.pm but I don't need to do any exporting as Login.pm is not used by other scripts for its functions. Also, instead of

use autouse Edit => qw(&login &login2);
I should have
use autouse Edit => qw(login login2);
i.e. without the ampersand.

Let me know if I've made any blunders :)

Replies are listed 'Best First'.
•Re: Re: •Re: Re: •Re: How to use require...
by merlyn (Sage) on Jan 03, 2004 at 18:29 UTC
    Let's go back to basics. To use autouse, you have to have a module that if you said use Login qw(login), it'd define and export a login() subroutine. Yes, that means you have to use Exporter in the proper fashion. I don't see that there.

    Fix up your Login.pm file to be a proper module. Then try playing with autouse again. Something like:

    ## Login.pm package Login; use base qw(Exporter); @EXPORT_OK = qw(login login2); sub login { ... } sub login2 { ... } 1; ## main: use autouse Login => qw(login login2); ...

    -- Randal L. Schwartz, Perl hacker
    Be sure to read my standard disclaimer if this is a reply.

      Thanks a zillion :)

      I was a little unsure because even though I didn't have the two lines "use base qw(Exporter); @EXPORT_OK = qw(login login2);" in Login.pm, the code still works:

      ## Login.pm package Login; sub login { ... } sub login2 { ... } 1; ## main: use autouse Login => qw(login login2);
      I thought it was something unusual about "autouse" that precluded the need to use Exporter in Login.pm. But now that I've learnt that Login.pm needs to be a proper module, I'll make the change right away :)