□Perl 講座 特別編 > メールとURL

◆状況によって出力を変えよう!

例えば、入力フォームのE-mailやURLを記入しなかった場合、リンクが残ったりしてたら格好悪いですよね?また、URLなどは半角の連続する英数字なんで、長いものになるとデザインの破壊になってしまいます。こんなことが無いように、入力された値によって出力を変えてみましょう!!



◆表示処理プログラムの改造

まず、後々のため?URLはhttp://部分を省いて記録させた方が便利だったりします。そこで、デコード処理部分にURLを入力した際にhttp://を省くようにしておきます。

#デコードするためのプログラム
sub decode {

    # プラウザからのデータ取込み
    if ($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }
    else {
        $buffer = $ENV{'QUERY_STRING'};
    }

    # プラウザからのデータ変換
    @pairs = split(/&/,$buffer);
    foreach $pair (@pairs) {
        #1行毎に$name,$valueを取り出す
        ($name, $value) = split(/=/, $pair);
        # 変換演算子 tr + を スペースに置き換え
        $value =~ tr/+/ /;
        # 変換演算子 s/// 単語の構成文字にマッチ
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        # " を " に変換
        $value =~ s/"/"/g;
        #\n を "" に変換
        $value =~ s/\n//g;

        # 日本語に変換(デコード処理部分)
        &jcode'convert(*value,'sjis');
        &jcode'convert(*name,'sjis');
        $FORM{$name} = $value;
        if ($name eq 'url') {
            $FORM{$name} =~ s/http:\/\///g;
        }

    }
}

次に実際の処理ですが、簡単に言ってしまうと、if文でそれぞれの条件に合わせて複数個のHTML出力を用意してあげればいい訳です。これを応用すると、条件によってアイコンにリンクを貼った状態で出力させたり、未記入などの表示をさせたり、何も出力させなかったりと自分好みに設定できます。

#リピート部分プログラム
sub output {
    print <<"EOT";
投稿者:$name<BR>
EOT

    #メールの入力の有無
    if ($email eq '') {
        print "E-mail:未記入<BR>\n";
    }
    else {
        print "[<A href=\"mailto:$email\">E-mail</A>]<BR>\n";
    }

    #URLの入力の有無
    if ($url eq '') {
        print "Homepage:未記入<BR>\n";
    }
    else {
        print "[<A href=\"http://$url\" target=\"_blank\">Homepage</A>]<BR>\n";
    }

    print <<"EOT";

投稿内容<BR>
$msr
<HR>
EOT
}

と言うように、入力の有無で、出力結果をそれぞれ記述してあげれば、対応した表示をさせることが可能となります。

[sample3]

□特別編 一緒に簡易掲示板を作ってみよう