我从 Perl 散列(关联数组)中得到了意想不到的结果。
我正在尝试从 CGI 帖子中填充它,其中可能缺少某些表单值。
use strict;
use Data::Dumper;
use CGI;
my $cgi = new CGI;
my %data = (
'key1' => $cgi->param('fkey1'),
'key2' => $cgi->param('fkey2'),
'key3' => $cgi->param('fkey3'),
'key4' => $cgi->param('fkey4'),
'key5' => $cgi->param('fkey5'),
'key6' => $cgi->param('fkey6'),
'key7' => $cgi->param('fkey7'),
'key8' => $cgi->param('fkey8'),
'key9' => $cgi->param('fkey9'),
'key0' => $cgi->param('fkey0'),
);
print "Content-type: text/html\n\n<pre>";
print Dumper \%data;
my $fkey1 = $cgi->param('fkey1');
my $fkey2 = $cgi->param('fkey2');
my $fkey3 = $cgi->param('fkey3');
my $fkey4 = $cgi->param('fkey4');
my $fkey5 = $cgi->param('fkey5');
my $fkey6 = $cgi->param('fkey6');
my $fkey7 = $cgi->param('fkey7');
my $fkey8 = $cgi->param('fkey8');
my $fkey9 = $cgi->param('fkey9');
my $fkey0 = $cgi->param('fkey0');
my %data2 = (
'key1' => $fkey1,
'key2' => $fkey2,
'key3' => $fkey3,
'key4' => $fkey4,
'key5' => $fkey5,
'key6' => $fkey6,
'key7' => $fkey7,
'key8' => $fkey8,
'key9' => $fkey9,
'key0' => $fkey0,
);
print "Content-type: text/html\n\n<pre>";
print Dumper \%data2;
%data 完全错误。我必须像 %data2 那样做。其输出是:
$VAR1 = {
'key9' => 'key0',
'key5' => 'key6',
'key1' => 'key2',
'key7' => 'key8',
'key3' => 'key4'
};
$VAR1 = {
'key9' => undef,
'key5' => undef,
'key6' => undef,
'key8' => undef,
'key0' => undef,
'key3' => undef,
'key2' => undef,
'key1' => undef,
'key4' => undef,
'key7' => undef
};
因此,如果 $cgi->param('fkey1') 是 undef,它会跳过该值并使用下一个键作为值。我需要做些什么才能让 %data 正常工作吗?
最佳答案
此问题是由于 param
在列表上下文与标量上下文中的行为方式所致。
在标量上下文中,如果参数不存在,param
返回undef
。在列表上下文中,它返回一个空列表。所以假设你有一个像这样的散列初始化:
my %data = ( foo => $cgi->param( 'foo' ),
bar => $cgi->param( 'bar' ),
baz => $cgi->param( 'baz' ) );
并且假设参数bar
不存在。由于 param
是在列表上下文中调用的,因此传递给哈希初始化的列表最终看起来像这样:
( 'foo', 'foovalue', 'bar', 'baz', 'bazvalue' )
请注意 bar
键后没有任何内容,因为那里返回了一个空列表。
要修复它,您可以强制所有对 param
的调用进入标量上下文:
my %data = ( foo => scalar $cgi->param( 'foo' ),
bar => scalar $cgi->param( 'bar' ),
baz => scalar $cgi->param( 'baz' ) );
现在列表看起来像这样:
( 'foo', 'foovalue', 'bar', undef, 'baz', 'bazvalue' )
世界又恢复正常了。
关于Perl 哈希未按预期初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22615533/