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

I think I may have hit on an undocumented feature, or at least one that I didn't know existed.

When a POST'd form is sent to a enabled script, apparently you can use the query_string() method to create a state-saving parameter list, suitable to be loaded into a new instance to restore the parameters at a later date.

My impression was that the query_string method returned the "unprocessed query string" (quoted from the docs), which led me to believe it returned $ENV{QUERY_STRING}.

Happily, this doesn't appear to be the case. Do other folks use/abuse this feature, and is it something I can rely upon?

-Any sufficiently advanced technology is
indistinguishable from doubletalk.

  • Comment on Interesting query_string behavior

Replies are listed 'Best First'.
•Re: Interesting query_string behavior
by merlyn (Sage) on Aug 13, 2002 at 18:01 UTC
    I think your leap from "unprocessed query string" to $ENV{QUERY_STRING} is the mistake here. Since the model of is that it work nearly transparently for both GET and POST, I would never have imagined it to generate different results for query_string().

    So I presume, yes this is a feature, and yes, it's not going away soon.

    -- Randal L. Schwartz, Perl hacker

      This behavior does seem consistent with how the rest of works.

      For some reason I had it in my head that methods like query_string() and script_name() were just convenience methods for getting %ENV values, but this isn't the case. Fine with me, because this is a very nice feature. . .The docs were just a bit confusing as to what was actually returned from query_string().


      -Any sufficiently advanced technology is
      indistinguishable from doubletalk.

        Indeed. It even becomes clearer when we look at the code. :)

        #### Method: query_string # Synthesize a query string from our current # parameters #### 'query_string' => <<'END_OF_FUNC', sub query_string { my($self) = self_or_default(@_); my($param,$value,@pairs); foreach $param ($self->param) { my($eparam) = escape($param); foreach $value ($self->param($param)) { $value = escape($value); push(@pairs,"$eparam=$value"); } } return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs); }

        - from

        So it simply constructs a query string from the given name/value pairs already in the CGI object. It'll even use that far-out semicolon format if you want it to. :)