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

Hello monks,

I have recently rearranged the code in a fairly large script I have been working on for some time. This change was neccessary to solve some syntax errors but since this change I have been getting this error. Following is a sample of the overall script (at least what I think is relavant).

#!C:\Perl\bin\perl.exe use strict; use warnings; sub readPostInput() { my (%searchField, $buffer, $pair, @pairs); if ($ENV{'REQUEST_METHOD'} eq 'POST') { read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { my ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/e +g; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg +; $searchField{ $name } = $value; } } } my %postInputs = readPostInput(); print "Content-type: text/html\n\n"; print "Complete :: $ENV{'REQUEST_METHOD'}";

It seems that environment variables such as REQUEST_METHOD, CONTENT_LENGTH, and REMOTE_ADDR are not being defined. I have tried running this from IE and from a command line. This script outputs the following:

Use of uninitialized value in string eq at test2.pl line 10. Odd number of elements in hash assignment at test2.pl line 26. Content-type: text/html Use of uninitialized value in concatenation (.) or string at test2.pl +line 29. Complete ::

Please, help, and thank you in advance.

Replies are listed 'Best First'.
Re: $ENV{'REQUEST_METHOD'} undefined?
by moritz (Cardinal) on Nov 30, 2009 at 11:48 UTC
    It seems the script is meant to be run via Common Gateway Interface, but is not.

    I highly recommend using the CGI module (or another well-tested CGI module from CPAN) instead of using hand-written routines.

      I don't quite understand. I have updated the code (to the best of my ability) to use the CGI module. Perhaps, I am leaving something out. Keep in mind that the actual script will accept any number of parameters through an HTML form.

      #!C:\Perl\bin\perl.exe use strict; use warnings; use CGI; my $req_meth = CGI->request_method(); sub readPostInput() { my (%searchField, $buffer, $pair, @pairs); if ($req_meth eq 'POST') { read (STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach $pair (@pairs) { my ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/e +g; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg +; $searchField{ $name } = $value; } } } my %postInputs = readPostInput(); print "Content-type: text/html\n\n"; print "Complete :: $req_meth";

      After these changes I still receive the same error.

        use strict; use warnings; use CGI; my $req_meth = CGI->request_method(); my %postInputs = CGI->Vars; ...

        Still you haven't answered the most important question: Is the script run as a CGI script? That is, is there a web server that executes it with the CGI protocol?

        Perl 6 - links to (nearly) everything that is Perl 6.
Re: $ENV{'REQUEST_METHOD'} undefined?
by rovf (Priest) on Nov 30, 2009 at 12:24 UTC
    Though I can't relate the error message to line number 10 (you should have included line numbers in your listing), I agree with you that the environment variable REQUEST_METHOD is not defined. This is, however, not a problem related to Perl, so maybe you should post your question at a forum related to the webserver you are using.

    Since you complain that the same error is true when you invoke the script from the command line, I have to ask you: Are you sure that you had defined those environment variables on the command line, before invoking your program?

    -- 
    Ronald Fischer <ynnor@mm.st>

      I belive this is a problem with my Perl syntax since I have used this subroutine in the past without error on the same server running the same version of Perl. I have recently moved the subroutine readPostInput() from the bottom of the script to the top because I was receiving an error similar to this:

      main::readPostInput() called too early to check prototype at index.pl line 18.

      This problem didn't persist until after I used this forward declaration technique.

        I belive this is a problem with my Perl syntax
        Did you verify the environment at the point of failure? Honestly, we are talking whether or not a certain environment variable is or is not defined at a particular point of the program. This can be verified easily. Also, you can verify whether this environment variable is or is not defined at the start of the program (to cover the case where your program is deleting it from the environment). What did you find out in this respect?

        -- 
        Ronald Fischer <ynnor@mm.st>