You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法插值输出$cgi->param($key)的CGI参数值?

Perl CGI脚本param()方法输出HASH引用而非参数值的原因

调试Perl CGI脚本时,遇到参数输出异常:

username
CGI=HASH(0x55887d94d850)->param{username} <--- 为何会这样?应该显示参数值。
password
CGI=HASH(0x55887d94d850)->param{password} <---

本该输出参数值,却出现了HASH结构的字符串,原因如下:

出错的代码片段

#!/usr/bin/perl -w                                                                                                           
use strict;                                                                                                                  
use warnings;                                                                                                                
use CGI("-utf8");                                                                                                            
use CGI::Session;                                                                                                            
use CGI::Carp qw(fatalsToBrowser);
sub BEGIN {
  unshift (@INC, '/var/application/module/');
};                                                                                                                           
use Auth;

### Header                                                                                                                   
########################                                                                                                       
my $cgi = CGI->new();

##########                                                                                                                   
if ( $ENV{REQUEST_METHOD} eq "POST" ) {
  my %form;
  my $session_dir="/var/tmp";
  my ($admin_user,$admin_password) = ("admin","arun123");

  print "Content-type: text/html; charset=utf-8\n\n";
  print "<!DOCTYPE html>\n";
  print "<html>\n";
  foreach my $key ($cgi->param()) {
    $form{$key} = $cgi->param($key);
    #print "<h3>$key $cgi->param{$key}</h3>\n";                                                                              
    print "<h3>$key</h3>\n";
    print "<h3>$cgi->param($key)</h3>\n";
  };
  print "</html>\n";
  exit;
}

正确的Vars()用法结果

使用Vars()方法时能得到正确输出:

password arun123
username admin

对应代码:

my %vars = $cgi->Vars();
my $args;
for my $key (keys %vars) {
  my $var = $vars{$key};
  chomp $var;
  $var =~ s/^\s+//;
  $var =~ s/\s+$//;
  $args->{$key} = $var;
  print "<h3>$key $var</h3>\n";
};

问题根源

错误出在你注释掉的那行代码:$cgi->param{$key}。

  • Perl中,调用对象方法必须使用**小括号()**,正确写法是$cgi->param($key)`;
  • 大括号{}是哈希引用的键访问语法,比如$hash_ref->{key},当你写$cgi->param{$key}时,Perl会将其解析为$cgi->{param}{$key},试图访问CGI对象内部哈希结构里的param子哈希中的$key键,但CGI对象并没有这样的内部结构,因此Perl将这个无效的哈希访问表达式转换成字符串输出,就出现了CGI=HASH(0x55887d94d850)->param{username}这类内容。

你当前代码中已经改成了正确的$cgi->param($key),运行这段代码应该能正常输出参数值;而Vars()方法是CGI模块提供的另一种批量获取参数的方式,它直接返回包含所有参数的哈希,因此结果正确。

内容的提问来源于stack exchange,提问作者Marcos Camargo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:04:58