Как превратить Perl-хеш в серию скалярных переменных? - PullRequest
3 голосов
/ 24 марта 2011

Я получаю информацию из 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 ]

14 голосов
/ 24 марта 2011

Вы можете использовать срез хэша для одновременного присвоения нескольким переменным:

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

Для динамического создания переменных потребуется eval().

5 голосов
/ 24 марта 2011

Использовать OO-интерфейс CGI.

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

Не импортируйте имена в глобальное пространство имен (main: :), иначе рано или поздно у вас возникнут проблемы.

2 голосов
/ 24 марта 2011

То, что вы пытаетесь сделать, называется символическими ссылками (см. perldoc perlref и найдите / Символические ссылки /) Это не считается лучшей практикой.

Попробуйте:

for my $key ( keys %form ){
  no strict;
  $$key = $form{$key};
}
1 голос
/ 24 марта 2011
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);
}
...