3

HTMLフォームから入力を取得しています。多数のテキスト入力があるため、多数のキーと値のペアがあります。ペアが 3 つ以上ある場合、私の現在の方法は耐え難いほど退屈であることがわかります。

知りたいのですが、ハッシュを一連のスカラー変数に変換するより効率的な方法はありますか? キーを変数名にして、キーの値に設定したい。

私は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

4 に答える 4

15

ハッシュ スライスを使用して、一度に複数の変数に割り当てることができます。

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

変数を動的に作成するには、 が必要ですeval()

于 2011-03-24T12:15:49.457 に答える
5

CGI の OO インターフェイスを使用します。

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

ただし、import_names をグローバル名前空間 (main::) に含めないでください。遅かれ早かれ問題が発生します。

于 2011-03-24T13:39:26.120 に答える
2

あなたがやろうとしていることは、シンボリック参照と呼ばれます(perldoc perlref/シンボリック参照/を参照して検索してください)。これはベスト プラクティスとは見なされません。

試す:

for my $key ( keys %form ){
  no strict;
  $$key = $form{$key};
}
于 2011-03-24T13:17:52.370 に答える
2
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);
}
于 2011-03-24T16:39:51.057 に答える