Perl 哈希未按预期初始化

标签 perl

我从 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/

相关文章:

perl - 我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?

regex - 为什么这个正则表达式不起作用?

arrays - 无法从Perl中的子例程插入数组

mysql - 如何确保不将空值输入到 mysql 数据库行中?

regex - 打印 Perl s///g 中发生了多少次替换?

perl hash ref 运算符工作异常

perl - 删除了自定义 HTTP header 字段

Perl,动态包含包

perl - 使用 WWW::Mechanize,如何添加带下划线的小写标题?

perl - 在我的许多基于 Moose 的子类中重写属性的最有效方法是什么?