📄 cgi.html
字号:
invocations.</p>
<p>If you are using the function call interface, use "Delete()" instead
to avoid conflicts with Perl's built-in delete operator.</p>
<p>
</p>
<h2><a name="deleting_all_parameters_">DELETING ALL PARAMETERS:</a></h2>
<pre>
<span class="variable">$query</span><span class="operator">-></span><span class="variable">delete_all</span><span class="operator">();</span>
</pre>
<p>This clears the CGI object completely. It might be useful to ensure
that all the defaults are taken when you create a fill-out form.</p>
<p>Use <code>Delete_all()</code> instead if you are using the function call interface.</p>
<p>
</p>
<h2><a name="handling_nonurlencoded_arguments">HANDLING NON-URLENCODED ARGUMENTS</a></h2>
<p>If POSTed data is not of type application/x-www-form-urlencoded or
multipart/form-data, then the POSTed data will not be processed, but
instead be returned as-is in a parameter named POSTDATA. To retrieve
it, use code like this:</p>
<pre>
<span class="keyword">my</span> <span class="variable">$data</span> <span class="operator">=</span> <span class="variable">$query</span><span class="operator">-></span><span class="variable">param</span><span class="operator">(</span><span class="string">'POSTDATA'</span><span class="operator">);</span>
</pre>
<p>(If you don't know what the preceding means, don't worry about it. It
only affects people trying to use CGI for XML processing and other
specialized tasks.)</p>
<p>
</p>
<h2><a name="direct_access_to_the_parameter_list_">DIRECT ACCESS TO THE PARAMETER LIST:</a></h2>
<pre>
<span class="variable">$q</span><span class="operator">-></span><span class="variable">param_fetch</span><span class="operator">(</span><span class="string">'address'</span><span class="operator">)-></span><span class="operator">[</span><span class="number">1</span><span class="operator">]</span> <span class="operator">=</span> <span class="string">'1313 Mockingbird Lane'</span><span class="operator">;</span>
<span class="keyword">unshift</span> <span class="variable">@</span><span class="operator">{</span><span class="variable">$q</span><span class="operator">-></span><span class="variable">param_fetch</span><span class="operator">(</span><span class="string">-name</span><span class="operator">=></span><span class="string">'address'</span><span class="operator">)</span><span class="operator">}</span><span class="operator">,</span><span class="string">'George Munster'</span><span class="operator">;</span>
</pre>
<p>If you need access to the parameter list in a way that isn't covered
by the methods above, you can obtain a direct reference to it by
calling the <strong>param_fetch()</strong> method with the name of the . This
will return an array reference to the named parameters, which you then
can manipulate in any way you like.</p>
<p>You can also use a named argument style using the <strong>-name</strong> argument.</p>
<p>
</p>
<h2><a name="fetching_the_parameter_list_as_a_hash_">FETCHING THE PARAMETER LIST AS A HASH:</a></h2>
<pre>
<span class="variable">$params</span> <span class="operator">=</span> <span class="variable">$q</span><span class="operator">-></span><span class="variable">Vars</span><span class="operator">;</span>
<span class="keyword">print</span> <span class="variable">$params</span><span class="operator">-></span><span class="operator">{</span><span class="string">'address'</span><span class="operator">}</span><span class="operator">;</span>
<span class="variable">@foo</span> <span class="operator">=</span> <span class="keyword">split</span><span class="operator">(</span><span class="string">"\0"</span><span class="operator">,</span><span class="variable">$params</span><span class="operator">-></span><span class="operator">{</span><span class="string">'foo'</span><span class="operator">}</span><span class="operator">);</span>
<span class="variable">%params</span> <span class="operator">=</span> <span class="variable">$q</span><span class="operator">-></span><span class="variable">Vars</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">use</span> <span class="variable">CGI</span> <span class="string">':cgi-lib'</span><span class="operator">;</span>
<span class="variable">$params</span> <span class="operator">=</span> <span class="variable">Vars</span><span class="operator">;</span>
</pre>
<p>Many people want to fetch the entire parameter list as a hash in which
the keys are the names of the CGI parameters, and the values are the
parameters' values. The <code>Vars()</code> method does this. Called in a scalar
context, it returns the parameter list as a tied hash reference.
Changing a key changes the value of the parameter in the underlying
CGI parameter list. Called in a list context, it returns the
parameter list as an ordinary hash. This allows you to read the
contents of the parameter list, but not to change it.</p>
<p>When using this, the thing you must watch out for are multivalued CGI
parameters. Because a hash cannot distinguish between scalar and
list context, multivalued parameters will be returned as a packed
string, separated by the "\0" (null) character. You must split this
packed string in order to get at the individual values. This is the
convention introduced long ago by Steve Brenner in his cgi-lib.pl
module for Perl version 4.</p>
<p>If you wish to use <code>Vars()</code> as a function, import the <em>:cgi-lib</em> set of
function calls (also see the section on CGI-LIB compatibility).</p>
<p>
</p>
<h2><a name="saving_the_state_of_the_script_to_a_file_">SAVING THE STATE OF THE SCRIPT TO A FILE:</a></h2>
<pre>
$query->save(\*FILEHANDLE)</pre>
<p>This will write the current state of the form to the provided
filehandle. You can read it back in by providing a filehandle
to the <code>new()</code> method. Note that the filehandle can be a file, a pipe,
or whatever!</p>
<p>The format of the saved file is:</p>
<pre>
NAME1=VALUE1
NAME1=VALUE1'
NAME2=VALUE2
NAME3=VALUE3
=</pre>
<p>Both name and value are URL escaped. Multi-valued CGI parameters are
represented as repeated names. A session record is delimited by a
single = symbol. You can write out multiple records and read them
back in with several calls to <strong>new</strong>. You can do this across several
sessions by opening the file in append mode, allowing you to create
primitive guest books, or to keep a history of users' queries. Here's
a short example of creating multiple session records:</p>
<pre>
<span class="keyword">use</span> <span class="variable">CGI</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">open</span> <span class="operator">(</span><span class="variable">OUT</span><span class="operator">,</span><span class="string">">>test.out"</span><span class="operator">)</span> <span class="operator">||</span> <span class="keyword">die</span><span class="operator">;</span>
<span class="variable">$records</span> <span class="operator">=</span> <span class="number">5</span><span class="operator">;</span>
<span class="keyword">foreach</span> <span class="operator">(</span><span class="number">0</span><span class="operator">..</span><span class="variable">$records</span><span class="operator">)</span> <span class="operator">{</span>
<span class="keyword">my</span> <span class="variable">$q</span> <span class="operator">=</span> <span class="variable">new</span> <span class="variable">CGI</span><span class="operator">;</span>
<span class="variable">$q</span><span class="operator">-></span><span class="variable">param</span><span class="operator">(</span><span class="string">-name</span><span class="operator">=></span><span class="string">'counter'</span><span class="operator">,</span><span class="string">-value</span><span class="operator">=></span><span class="variable">$_</span><span class="operator">);</span>
<span class="variable">$q</span><span class="operator">-></span><span class="variable">save</span><span class="operator">(\</span><span class="variable">*OUT</span><span class="operator">);</span>
<span class="operator">}</span>
<span class="keyword">close</span> <span class="variable">OUT</span><span class="operator">;</span>
</pre>
<pre>
<span class="comment"># reopen for reading</span>
<span class="keyword">open</span> <span class="operator">(</span><span class="variable">IN</span><span class="operator">,</span><span class="string">"test.out"</span><span class="operator">)</span> <span class="operator">||</span> <span class="keyword">die</span><span class="operator">;</span>
<span class="keyword">while</span> <span class="operator">(!</span><span class="keyword">eof</span><span class="operator">(</span><span class="variable">IN</span><span class="operator">))</span> <span class="operator">{</span>
<span class="keyword">my</span> <span class="variable">$q</span> <span class="operator">=</span> <span class="variable">new</span> <span class="variable">CGI</span><span class="operator">(\</span><span class="variable">*IN</span><span class="operator">);</span>
<span class="keyword">print</span> <span class="variable">$q</span><span class="operator">-></span><span class="variable">param</span><span class="operator">(</span><span class="string">'counter'</span><span class="operator">),</span><span class="string">"\n"</span><span class="operator">;</span>
<span class="operator">}</span>
</pre>
<p>The file format used for save/restore is identical to that used by the
Whitehead Genome Center's data exchange format "Boulderio", and can be
manipulated and even databased using Boulderio utilities. See</p>
<pre>
<a href="http://stein.cshl.org/boulder/">http://stein.cshl.org/boulder/</a></pre>
<p>for further details.</p>
<p>If you wish to use this method from the function-oriented (non-OO)
interface, the exported name for this method is <strong>save_parameters()</strong>.</p>
<p>
</p>
<h2><a name="retrieving_cgi_errors">RETRIEVING CGI ERRORS</a></h2>
<p>Errors can occur while processing user input, particularly when
processing uploaded files. When these errors occur, CGI will stop
processing and return an empty parameter list. You can test for
the existence and nature of errors using the <em>cgi_error()</em> function.
The error messages are formatted as HTTP status codes. You can either
incorporate the error text into an HTML page, or use it as the value
of the HTTP status:</p>
<pre>
<span class="keyword">my</span> <span class="variable">$error</span> <span class="operator">=</span> <span class="variable">$q</span><span class="operator">-></span><span class="variable">cgi_error</span><span class="operator">;</span>
<span class="keyword">if</span> <span class="operator">(</span><span class="variable">$error</span><span class="operator">)</span> <span class="operator">{</span>
<span class="keyword">print</span> <span class="variable">$q</span><span class="operator">-></span><span class="variable">header</span><span class="operator">(</span><span class="string">-status</span><span class="operator">=></span><span class="variable">$error</span><span class="operator">),</span>
<span class="variable">$q</span><span class="operator">-></span><span class="variable">start_html</span><span class="operator">(</span><span class="string">'Problems'</span><span class="operator">),</span>
<span class="variable">$q</span><span class="operator">-></span><span class="variable">h2</span><span class="operator">(</span><span class="string">'Request not processed'</span><span class="operator">),</span>
<span class="variable">$q</span><span class="operator">-></span><span class="variable">strong</span><span class="operator">(</span><span class="variable">$error</span><span class="operator">);</span>
<span class="keyword">exit</span> <span class="number">0</span><span class="operator">;</span>
<span class="operator">}</span>
</pre>
<p>When using the function-oriented interface (see the next section),
errors may only occur the first time you call <em>param()</em>. Be ready
for this!</p>
<p>
</p>
<h2><a name="using_the_functionoriented_interface">USING THE FUNCTION-ORIENTED INTERFACE</a></h2>
<p>To use the function-oriented interface, you must specify which CGI.pm
routines or sets of routines to import into your script's namespace.
There is a small overhead associated with this importation, but it
isn't much.</p>
<pre>
<span class="keyword">use</span> <span class="variable">CGI</span> <span class="operator"><</span><span class="variable">list</span> <span class="variable">of</span> <span class="variable">methods</span><span class="operator">>;</span>
</pre>
<p>The listed methods will be imported into the current package; you can
call them directly without creating a CGI object first. This example
shows how to import the <strong>param()</strong> and <strong>header()</strong>
methods, and then use them directly:</p>
<pre>
<span class="keyword">use</span> <span class="variable">CGI</span> <span class="string">'param'</span><span class="operator">,</span><span class="string">'header'</span><span class="operator">;</span>
<span class="keyword">print</span> <span class="variable">header</span><span class="operator">(</span><span class="string">'text/plain'</span><span class="operator">);</span>
<span class="variable">$zipcode</span> <span class="operator">=</span> <span class="variable">param</span><span class="operator">(</span><span class="string">'zipcode'</span><span class="operator">);</span>
</pre>
<p>More frequently, you'll import common sets of functions by referring
to the groups by name. All function sets are preceded with a ":"
character as in ":html3" (for tags defined in the HTML 3 standard).</p>
<p>Here is a list of the function sets you can import:</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -