Parse form data using Perl

Parsing form data is easy using Perl. The subroutine below will parse the data and place the variables in a %FORM hash.

sub parse {

  if ( $ENV{'CONTENT_TYPE'} =~ m|^multipart/form-data|i ) {

    my $q = new CGI;

    %FORM = $q->Vars;

  } else {

    my ($vars,@VARS);

    if ( $ENV{'REQUEST_METHOD'} eq "GET" ) {

      $vars = $ENV{'QUERY_STRING'};

    } elsif ( $ENV{'REQUEST_METHOD'} eq "POST" ) {

      read(STDIN,$vars,$ENV{'CONTENT_LENGTH'});

    }

    @VARS = split(/[&;]/,$vars); 

    foreach $i ( 0 .. $#VARS ) {

      $VARS[$i] =~ s/+/ /g;

      my ($key, $val) = split(/=/,$VARS[$i],2); 

      $key =~ s/%(..)/pack("c",hex($1))/ge;
      $val =~ s/%(..)/pack("c",hex($1))/ge;

      $FORM{$key} .= "" if ( defined($FORM{$key}) );

      $FORM{$key} .= $val;

    }

  }
 
}

To parse input call the subroutine at the beginning of your script:

parse();

To get variable values:

The value of name is $FORM{'name'}

posted March 10, 2010 in Perl