On 7/6/07, CraigT <[EMAIL PROTECTED]> wrote:
In this regard though, I would like to ask what you recommend to pass back several paramters from a sub
The usual way to do it is to accept a list of return values: my ($foo, $bar) = sub_call($param);
I'd like to focus on this problem here because I don't feel like I have much control between the anchor click and the retrival of the paramters in the invoked module.
You don't have any control of that. That's handled by the web browser and your operating system. We just assume that part works. I don't think the problem is there.
I haven't shown the code because I'm not quite sure how.
The best thing to do is to try to make a small example program that shows the problem. Sometimes, just by trying to make a small example of it, you fix the problem.
The first module presented is m3.cgi.
This code has some problems. This isn't a general Perl help mailing list, but I'll point out a couple of quick things. I also recommend that you buy a copy of "Perl Best Practices" and join http://perlmonks.org/ in order to have a community of people to help you with general Perl questions.
use strict;
Use warnings too.
(my $ai, my $row, my $r, my $col, my $c, my $cpos, my $blankx, my $lstr, my $xlnklen, my $zzx, my $firstcpos) = "";
This kind of initialization isn't necessary. It's better to declare your variables right before you use them, to keep the scope as small as possible. The way you're initializing them here won't work anyway, since you only have one empty string, and a list of variables on the left.
# Get document root and server name. foreach $key (sort keys(%ENV)) { if ($key eq 'DOCUMENT_ROOT') { $docroot = $ENV{$key}; } if ($key eq 'SERVER_NAME') { $servname = $ENV{$key}; } }
That should just be $docroot = $ENV{DOCUMENT_ROOT}; $servername = $ENV{SERVER_NAME};
open(ORG,"<$orgidfn"); flock(ORG,LOCK_SH); @glines = <ORG>; close(ORG);
Any time you open, flock, or close, you must check for errors with the usual "or die" construct.
print "Content-type: text/html\n\n";
Use $page->header() instead.
print "<HTML><HEAD><TITLE>$gov Efforts</TITLE>
A templating system might make this HTML easier for you to deal with. You could start with something simple, like Text::Template.
# Get the paramters from the calling program - shoidls.cgi. $govlevel = $page->param("str");
I don't see anything wrong with this, or with the call where you created $page, above. Put in a "warn $govlevel" there and see if it's what you think it should be. If it is, manually change the value of str in the URL in your browser and try it again, checking to see if the variable changes too.
If I preload (compile) my application programs into the Apache registry as I hope to, when I execute under CGI I'm thinking those copies will be used if I have the correct handler (like the one below) in my Apache httpd?
Well, you won't be executing under CGI, but if you configure Registry to handle your URLs and you preload scripts for those URLs, they will be used. Your configuration is not correct though. Apache::Registry is mod_perl 1. Maybe you meant to say ModPerl::Registry?
I haven't found a package for Apache::RegistryLoader yet and may have to get it form CPAN.
No, ModPerl::RegistryLoader comes with mod_perl 2.
And when I transition to PerlRun and mod_perl, my understanding is that I should preload the application programs into the ModPerl::Registry?
You don't really have to preload anything. It may save you some memory, but it's not important at this point. Wait until your code is working to worry about things like that.
If I preload the Perl modules I'm using, do I still need to 'Use' those modules in my application programs?
You don't technically have to, but it's a good practice to do it anyway, to make it clear which modules depend on which others and make it easier to work with later. - Perrin