Re: problems with 'require'

[email protected] (Paweł Prędki) Sun, 29 Nov 2009 19:02:24 +0100
Newsgroups perl.beginners.cgi
Message-ID <[email protected]>

Matt Whipple pisze:
> Paweł Prędki wrote:
>> <file mydbtest.pm>
>>     package dbredwings;
> For organization reasons, you should probably make the package name
> match the file name
>>     my $platform = "mysql";
>>     my $database = "dbplayers";
>>     my $host = "localhost";
>>     my $tablename = "players";
>>     my $user = "player";
>>     my $pw = "pass";
>>
>>     sub printout {
>>         print shift;
>>     }
>>
>>     sub get_platform {
>>         print $platform;
>>     }
>>     1;
>> </file mydbtest.pm>
>>
>> <file properscript.cgi>
>>     require 'mydbtest.pm';
>>     print "Content-type: text/html\n\n";
>>     &mydbtest::printout('hey hey'); # (1)
> A package is a logical grouping within code, and it is through packages
> which you would specify functions.  Once a file is loaded (here through
> require) into memory, the original filename becomes somewhat
> inconsequential.  These functions should therefore be
> dbredwings::printout, etc. (here also dropping the & which is considered
> somewhat deprecated for simple function calling).  This is the reason
> for the previous comment about package naming. 
The package name and the file name are the same on my machine. I simply 
forgot to correct it when writing my last e-mail. I'm using the proper 
syntax, that is packagename::functionname;
> 
> I'd suggest reading the perlmod perldoc section a bit more, or cut out
> packaging all together if you're not taking advantage of it and treat
> the code as one big scary scope.

I will read up on that, thanks.

>>     &mydbtest::get_platform; # (2)
>>     print $mydbtest::platform; # (3)
>> </file properscript.cgi>
>>
>> (1) works without any problems. I get the proper output in my browser
>> window.
> Dumb luck... use strict; use warnings; ?

Got both in the file now.

>> (2) doesn't work at all. I get an error as follows:
>> Undefined subroutine &mydbtest::get_platform called at
>> E:/webdev/perl/properscript.cgi line 42.
>> (3) prints an empty string
>>
>> Also, I get an error message saying that the .pm file can't be found
>> when I place it in the same directory as the .cgi files. I have to
>> move it to a directory in the @INC array when I run it through the
>> server. However, when I run it locally, from the command line,
>> everything works just fine. This makes me think that there is
>> something in the Apache config that I have to do in order for all this
>> to work but I don't know what that is.
> The require statement access the file directly (outside the Web server),
> so it wouldn't be Apache's configuration.  It could be a permissions
> problem however.

I changed all the permissions and what I get now is that everything 
works fine but whenever I make changes to the .pm file I need to restart 
the server that is running locally for the changes to be seen in my main 
script... This is not the case on the live target server where I use 
both the .pm file and the scripts. So, after all, everything is sort of 
OK right now.

> 
>> I'm running ActivePerl 5.10.1 with Apache2.2 with mod_perl.
>> Alias /perl "E:\webdev\perl"
>>   <Location /perl>
>>      SetHandler perl-script
>>      PerlResponseHandler ModPerl::Registry
>>      Options +ExecCGI
>>      PerlOptions +ParseHeaders
>>   </Location>
>> ScriptAlias /cgi-bin/ "E:/webdev/perl/cgi-bin/"
>>
>> Cheers,
>> palo
>>
> 
>