如何将perl哈希转换为一系列标量变量?

时间:2011-03-24 12:09:51

标签: perl perl-hash

我从html表单获取输入。有一堆文本输入,因此有一堆键值对。当一个人有超过三对时,你会看到我现在的方法非常乏味。那,或者我只是懒惰。

我想知道,是否有更有效的方法将哈希转换为一系列标量变量?我希望密钥是变量名,设置为密钥的值。

我对perl相对较新,对不起,如果这是一个愚蠢的问题。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI qw(:standard Vars);

print "Content-type: text/html\n\n";

my %form = Vars();

$hourly = $form{hourly};
$hours_w = $form{hours_w};
$rent_m = $form{rent_m};
#...

4 个答案:

答案 0 :(得分:14)

您可以使用哈希切片一次分配给多个变量:

my ($hourly, $hours_w, $rent_m) = @{$form}{qw(hourly hours_w rent_m)};

动态创建变量需要eval()

答案 1 :(得分:5)

使用CGI的OO界面。

my $q = CGI->new();
$q->import_names('Q');
print $Q::hourly; # hourly param, if any

不要将import_names导入全局命名空间(main::),否则迟早会遇到麻烦。

答案 2 :(得分:2)

您要做的是称为符号引用(请参阅perldoc perlref并搜索/符号引用/)。它不被认为是最佳实践。

尝试:

for my $key ( keys %form ){
  no strict;
  $$key = $form{$key};
}

答案 3 :(得分:1)

my $cgi;
BEGIN {
    $cgi = CGI->new();
}

BEGIN {
    # Only create variables we expect for security
    # and maintenance reasons.
    my @cgi_vars = qw( hourly hours_w rent_m );

    for (@cgi_vars) {
        no strict 'refs';
        ${$_} = $cgi->param($_);
    }

    # Declare the variables so they can be used
    # in the rest of the program with strict on.
    require vars;
    vars->import(map "\$$_", @cgi_vars);
}