work.log

エンジニアの備忘録的ブログ

PerlのCGI.pmで受け取ったデータを連想配列に一気に変換

投稿:2013-09-01 20:39  更新:

Perl モジュール CGI.pm のメモ書きです。

HTML のフォームより送信された GET, POST データを、PHP でいうところの $data = $_POST みたいに一気に取得する方法です。

例えば、以下のようなフォームがあるとします。

<form action="dump.pl" method="post">
	<input type="text" name="data1" value="aaaaa" />
	<input type="text" name="data2" value="bbbbb" />
	<input type="text" name="data3" value="ccccc" />
	<input type="text" name="array[]" value="11111" />
	<input type="text" name="array[]" value="22222" />
	<input type="text" name="array[]" value="33333" />
	<input type="submit" value="POST"/>
</form>

これを一気に連想配列にぶち込みたい。

そこで、こんな感じにしてみました。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use Data::Dumper;

    my $q     = CGI->new;
    my $key   = '';
    my $value = '';
    my $hash  = {};

    if ($q->param()) {

        foreach my $key ($q->param) {

            foreach my $value ($q->param($key)){

                if ($value) {

                    if ($key =~ /^array\[\]$/) {

                        push(@{$hash->{array}}, $value);

                    } else {

                        $hash->{$key} = $value;

                    }

                }

            }

        }

    } else { $hash->{msg} = 'param is empty'; }

    &send_data($q, $hash);

sub send_data {

    my ($q, $hash) = @_;

    print $q->header(-expires=>'now', -charset=>'utf-8');
    print $q->start_html(-title=>'dump',-lang=>'ja-JP');

    print "<h1>dump</h1>\n";
    print "<pre>\n";
    print Dumper($hash);
    print "</pre>\n";
    print $q->end_html;

    return;

}
exit;

こんな感じに取れます。

dump

$VAR1 = {
          'data1' => 'aaaaa',
          'data2' => 'bbbbb',
          'data3' => 'ccccc',
          'array' => [
                     '11111',
                     '22222',
                     '33333'
                   ]
        };

データにはこんな感じにアクセスできます。

    print "$hash->{data1}\n";

    foreach ( @{$hash->{array}} ) {

        print "$_\n";

    }

こういう処理についてはやっぱり PHP の方が便利だな。

スポンサーリンク

コメント

  1. 匿名 より:

    use CGI;
    my $q = CGI->new;
    $params = $q->Vars;

    あるいは

    use CGI ‘:cgi-lib’;
    $params = Vars;

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間