ページ番号  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |  10

PerlでURIエンコード・デコードする。

「URIエンコード」とは、URIで使用禁止となっている文字を埋め込むためのルールである。
RFC上ではPercent-Encodingと呼ばれ、ASCII以外の文字を「%xx」(xxは16進数)という形でURIに表記することになっている。
使用される文字コードに制限はないが、16進数のコードは文字コードによって異なるため、デコードされた文字を扱う際はページに合わせて文字コードを変換する必要がある。

PerlでURIエンコードする場合、正規表現で1文字分を選択して、unpackで16進数の表記に変換、そして半角スペースを+に変換します。
URIデコードはその逆で、+をスペースに変換し、正規表現で %xx の xx をpackで文字データに戻します。
関数にしておけば簡単です。

URIエンコード
sub url_encode($) {
my $str = shift;
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
return $str;
}

URIデコード
sub url_decode($) {
my $str = shift;
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return $str;
}


RubyならURIモジュールにエンコード・デコード用の関数があるので一発です。
・URIエンコード ⇒
URI.escape($str) or URI.encode($str)

・URIデコード ⇒
URI.unescape($str) or URI.decode($str)


PerlもURI::Escapeモジュールを使えばURIエンコード・デコードが可能です。
use URI::Escape;
uri_escape($str);
uri_unescape($str);


Perl で url エンコードと url デコード
URIエンコード - Wikipedia
URI::Escape - search.cpan.org
URLを触る時は、URI(モジュール名)以外も知っておくと吉


【Perl5.8以降】現代的なPerlの記述方法

URL:http://d.hatena.ne.jp/perlcodesample/20091120/1246679588
リンク先のページでPerl5.8以降における標準的なPerlの書き方が解説されています。
Web上で配布されている掲示板はPerl4の頃に作成されたものが多いのですが、そろそろ新しいPerlで実装するべきなのかも。

現代的なPerlの記述方法一覧 + α - Perl入門~サンプルコードによるPerl入門~
・【必須】strictプラグマとwarningsプラグマを有効にする
・【必須】ファイルハンドルにはレキシカル変数を使う
・【必須】3引数のopen関数を使う
・【必須】ファイルオープン時のエラー処理を行う
・[推奨]レキシカル変数とサブルーチンの名前には小文字とアンダーバーを使用する
・[推奨]パッケージ変数には大文字とアンダーバーを使用する
・【必須】パッケージ変数は使わずにレキシカル変数を使う
・[推奨]標準的なコードのフォーマットで書く
・[推奨]日本語などのマルチバイト文字を適切に扱うためにEncodeモジュールを使用する
・[推奨]デフォルト変数 $_ は使用しない
・[推奨]foreach文ではレキシカル変数を宣言する
・(参考)日付処理の標準モジュールを使用する
・【必須】不必要なモジュールの読み込みは行わない
・[推奨]コメントの#の嵐は避ける
・[推奨]モジュールの関数をインポートするときは明示する
・【必須】gotoは使用しない
・[推奨]do ~ whileは使用しない
・[推奨]redoは使用しない
・[推奨]プロトタイプは使用しない


strictプラグマとwarningsプラグマ
ソースの先頭に「use strict」「use warnings」を書くと、Perlの文法チェックを厳しくするようになります。
※warningsプラグマはPerl5.6から標準モジュールに加わります。

レキシカル変数
レキシカル変数は「my」を使って宣言した変数です。
レキシカル変数を使うと他のサブルーチンに同じ名前の変数があっても区別されるため、値が操作されて思わぬ結果になることを防ぐことが可能です。さらにブロック内で宣言した場合も、そのブロック内でしか使えないため、ループや作業用の変数として使いやすくなっています。

gotoは使用しない
gotoを使用しなくても、ループを制御するなら「last」「next」が使えます。
エラー処理はdieを使うことで例外処理が可能です。


ページ番号  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |  10