PerlとPHPの違いを考えながら遊んでみる
はじめまして。ソーシャルアプリ事業部でエンジニアやってますチューブです。
根っからのTUBE好きなので、そのままあだ名になっちゃいました。
以前はPerlで携帯公式サイトとか、MovableTypeで情報サイトとか作ってました。
入社してまだ間もないですが、今回はボクが担当になりました。
TUBE愛とシステムのどちらを書こうか悩みましたが、
初めましてなので、Perlと正規表現を使った簡単なメールアドレスチェックで遊んでみようと思います。
(※因みに弊社では、サーバーサイドの開発言語はPHPが標準です)
PerlとPHPの簡単な違い
PerlとPHPでは勝手が少し違います。
まず、Perlを軸にPHPと異なる言語仕様を並べてみたいと思います。
- 変数
Perlでは変数名の先頭にプレフィクスという記号をつけることによって、これが変数であると認識します。
「$~」なんていう変数宣言はPHPでも同じですね。これはスカラ変数です。
スカラ変数 | :$ |
配列変数 | :@ |
連想配列(ハッシュ) | :% |
サブルーチン | :& |
- 関数
Perlでは関数名の前に sub をつけて関数を定義します。
同じプログラムファイル内で関数を呼び出す場合には、先頭に「&」のプレフィクスを付けるとコールできます。
1 2 3 4 |
[sourcecode lang="text"]&checkMailAddress(); sub checkMailAddress { ・・・ }[/sourcecode] |
また、引数の受け取り方は、基本的には以下3通りあります。
引数はリストとして、@_ という特殊な配列変数に格納されます。
そこから取り出す方法が3通りあるというわけです。
1. $_[0] を使って、一つ目の引数を取り出す
1 2 3 4 |
[sourcecode lang="text"]&checkMailAddress($mail_address); sub checkMailAddress { my $mail_address = $_[0]; }[/sourcecode] |
2. shift を使って、@_ の先頭の要素を切り取って返す
1 2 3 4 |
[sourcecode lang="text"]&checkMailAddress($mail_address); sub checkMailAddress { my $mail_address = shift; }[/sourcecode] |
3. @_ をそのまま使って、引数を配列に代入
1 2 3 4 |
[sourcecode lang="text"]&checkMailAddress($mail_address, $postal_code); sub checkMailAddress { my @address_data = @_; }[/sourcecode] |
- スコープ
Perlでは通常の変数はどこからでもアクセス可能なグローバルなスコープをもっています。
しかし、my演算子を使って変数を宣言すると、宣言した場所が {} で囲まれた部分(ブロック)の中なら、そのブロック内でだけアクセス可能な変数となります。
つまり、スコープが違っていれば、同じ名前の変数名が複数宣言されていても、それぞれ独立したものと扱われます。
1 2 3 4 5 6 7 |
[sourcecode lang="text"]my $item = "apple"; &getPrice();// 100 と表示。 sub getPrice { my $item = 100; print $item; } print $item;// apple と表示。[/sourcecode] |
以上Perlの簡単な言語仕様でした。
これに正規表現も混ぜて、メールアドレスに不正があったらエラーメッセージを返す処理を書いてみようと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
[sourcecode lang="text"]my $mail_address = "test@hoge.ne.jp"; my $err_message = &checkMailAddress($mail_address); sub checkMailAddress { my $mail_address = shift; my $err_message; if (defined($mail_address)) { // メールアドレスに半角英数字と「@.-_/+?」以外の半角記号が含まれていたらエラーを返したい場合は、以下のようにできます。 if ($mail_address =~ /[^0-9A-Za-z\@\.\-\_\/\+\?]/ ) { $err_message = qq|メールアドレスは半角英数字で入力してください。\n|; } // メールアドレスが101文字以上あったらエラーを返したい場合は、以下のようにできます。 if (length($mail_address) > 100 ) { $err_message .= qq|メールアドレスは100文字以内で入力してください。\n|; } // キャリアチェック if ($mail_address =~ /\@docomo\.ne\.jp$/) { // DoCoMo } elsif ($mail_address =~ /\@ezweb\.ne\.jp$/) { // au } elsif ($mail_address =~ /\@[tdhcrknsq]\.vodafone\.ne\.jp$/ || $mail_address =~ /\@softbank\.ne\.jp$/ || $mail_address =~ /\@disney\.ne\.jp$/) { // SoftBank } else { // その他 // メールアドレスの先頭末尾に記号があればエラーを返したい場合は、以下のようにできます。 if ($mail_address !~ /^[0-9A-Za-z]/ || $mail_address !~ /[0-9A-Za-z]$/) { $err_message .= qq|メールアドレスの最初と最後に記号はつかえません。\n|; } // メールアドレス@が複数含まれてたときにエラーを返したい場合は、以下のようにできます。 my $mail_address_at_check = $mail_address; $mail_address_at_check =~ s/[^\@]//g; if (length($mail_address_at_check) >= 2) { $err_message .= qq|メールアドレスに@は1つだけ入力してください。\n|; } } } else { // メールアドレスが未入力の場合 $err_message = qq|メールアドレスを入力してください。\n|; } return $err_message; }[/sourcecode] |
とまぁこんな感じになりました。
もっとスマートに書けよゴルア!と怒られそうですが・・・
個人的には、Perlの真髄は、MovableTypeと連動してプラグインを作ったり、再構築の重さ対策でダイナミックパブリッシングを組み込んだりしたときに出ると思います。
以上でしたー。