为何无法插值输出$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
相关产品推荐
相关产品推荐

