Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Accessing CGI objects from within a 'require'-ed file?

by Anonymous Monk
on Jun 21, 2006 at 21:39 UTC ( [id://556779]=perlquestion: print w/replies, xml ) Need Help??

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

I'm having issues accessing a CGI object in the main namespace from within a 'require'-ed file...For instance, this is my main script:
#!/usr/bin/perl -w use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); require "functions.pl"; # define a hash to contain any "global" objects or variables our %GLOBAL = ( 'query' => '', 'test' => 'foobar!' ); $GLOBAL{'query'} = new CGI; print CGI::header(); outputTest(); outputPOST();
and this is the library file it requires (functions.pl):
sub outputTest { print $main::GLOBAL{'test'}; } sub outputPOST { print $main::GLOBAL{'query'}->Vars; } 1;
running this as-is throws up an Internal Server Error, which is strange considering i'm using fatalsToBrowser. i'm sure the problem is with the CGI query object, because if I remove the outputPost subroutine, it runs fine.

am I just missing something vitally obvious?

Replies are listed 'Best First'.
Re: Accessing CGI objects from within a 'require'-ed file?
by merlyn (Sage) on Jun 21, 2006 at 22:14 UTC
Re: Accessing CGI objects from within a 'require'-ed file?
by mbadolato (Hermit) on Jun 21, 2006 at 23:23 UTC
    You may want to try checking permissions. Also check linefeeds of you're moving the file back and forth between Windows and Unix (some ftp clients don't convert them). I just copied both of your code snippets into two separate files and hit it with my browser and it worked. I added some parameters to the query string, and got the outputPost data printing too.

    test.cgi:

    #!/usr/bin/perl -w use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); require "functions.pl"; # define a hash to contain any "global" objects or variables our %GLOBAL = ( 'query' => '', 'test' => 'foobar!' ); $GLOBAL{'query'} = new CGI; print CGI::header(); outputTest(); outputPOST();
    functions.pl:
    sub outputTest { print $main::GLOBAL{'test'}; } sub outputPOST { print $main::GLOBAL{'query'}->Vars; } 1;
    Hit the browser with http://192.168.1.102/test/test.cgi:
    foobar!
    Hit the browser with http://192.168.1.102/test/test.cgi?myvar=haha:
    foobar!myvarhaha
Re: Accessing CGI objects from within a 'require'-ed file?
by ruzam (Curate) on Jun 21, 2006 at 22:12 UTC
    Just for yucks, what happens if you replace outputPost with:
    sub outputPOST { my $cgi = $main::GLOBAL{'query'}; print $cgi->Vars; }
    'use warnings' will probably shed more light on the problem if you aren't already.
Re: Accessing CGI objects from within a 'require'-ed file?
by shmem (Chancellor) on Jun 22, 2006 at 10:30 UTC
    Yes, it's permissions. Just one note for functions.pl:
    use strict; our %GLOBAL; sub outputTest { print $GLOBAL{'test'}; } sub outputPOST { print $GLOBAL{'query'}->Vars; } 1;
    use strict and declaring vars with our is good practice. Since %GLOBAL is declared with "our", both files share the same variable. That's what our is about. No need to fully qualify %GLOBAL with the package name.

    cheers,
    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-16 12:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found