なぜPerlはダメでPHPを使うべきなのか?


2016.11.21更新

現在は昔と違ってPHPが広く普及しているので新規開発でPerlを使う利点はないと思います。
Perlがダメな理由は、未だに古いシェルスクリプトや大昔のBASICのような仕様を大切に残していて一般的な言語との互換性が低く且つ低機能なのでプログラム作成の難易度が上がり開発効率も悪くなることです。
Perlのコメントの書き方はC/C++、Java、C#などと互換性がありませんし、Perlは、else ifのような基本構文すらサポートしていません。
PerlはC言語よりもシェルスクリプトに合わせようとしているので、C言語の機能を多く取り入れたPHPとは雲泥の差が出てしまっています。
PHPにはC言語系のファイル入出力関数の、fprintf、fgets、C言語系の文字列処理関数のstrlen、strstr、strtok、strcmp、strncmpなとがありますが、Perlにはそれらがありません。
else ifも書けない、サブルーチン(関数)の引数の宣言もできないとか、シェルスクリプト?なのかとか30年前の8ビットパソコン用のBASICなのか?という言語仕様では見ても良く分からない汚いソースになり本格的なプログラムには不向きです。
Perlでプログラムを作れないわけではないですが効率が悪いです。
テキストファイルを読み込んで内容を表示するサンプルプログラムをC言語、PHP、Perlと作ってみましたたが、Perlはこんな小さいプログラムでも言語仕様が低機能すぎて往生こきました。
ファイルから一行読み込むPerlのサンプルプログラムを検索すると、読み込み最大文字数指定せずに一行を上限なく読もうとするサンプルプログラムばかり見つかりました。
読み込み最大文字数を指定しないで読み込むようないい加減なプログラムは作るべきではありません。
また読み込み最大文字数も指定しないで上限なくファイルから一行読み込みするサンプルばかり見つかる言語は明らかに欠陥言語ですから本格的なプログラムに使うべきではないです。
Perlは基本はコマンドを呼び出すだけといったシェルスクリプトの延長線にある簡易言語として割り切って使うものだと思います。
簡易言語だから簡単というわけではありません。
簡易言語であればあるほど何かしようとした時にすぐに行き詰まり難しいのです。
以下は、ファイルからテキストファイルを読み込んで表示するプログラムを作った場合のPHPとPerlのC言語に対する互換性の比較とC言語、PHP、Perlの自作したソースコードです。
PHP Perl
変数の先頭に$付加不要 ×($付けるとかまるでシェルスクリプト) ×($付けるとかまるでシェルスクリプト)
else if互換 ×(なぜにelsif。まるでシェルスクリプト)
関数の引数宣言 ×(まるで低機能言語BASIC。これでは関数ではなくBASICのサブルーチン)
break互換 ×(なぜにlast)
C言語main(int argc,char *argv[])互換 ×(argcがなく添え字がずれる)
C言語コメント(/* */)互換 ×(=pod =cutを使えとか言われても・・・)
C++コメント(//)互換 ×(なぜに#のみ。まるでシェルスクリプト)
printf()互換
fopen()互換 ×
fprintf()互換 ×
fgets()互換 △(使い方がちょっと違う) ×
fclose()互換 ×
ファイル一行入力最大文字数指定 ○(fgets) ×(こんな基本機能さえ自作しないといけないの?)
return互換 △(メイン不可)


C言語ソースコード(C++としてもコンパイル可)
/* C言語でテキストファイルの内容を表示するtextdump.php */ #include <stdio.h> int main(int argc,char *argv[]) { FILE *fp; char buf[2010]; if(argc != 2){ fprintf(stderr,"テキストファイルの内容を表示します。\n"); fprintf(stderr,"使い方: texdump 読み込みファイル名\n"); return 1; } if((fp = fopen( argv[1],"rt")) == NULL){ /* UNIXでは"rt"ではなく"r" */ fprintf(stderr,"ファイルオープンエラー[%s]",argv[1]); return 2; } while(fgets(buf,2000,fp) != NULL){ printf(buf); } fclose(fp); return 0; }


PHPソースコード
<?php /* PHPでテキストファイルの内容を表示するtextdump.php */ /* C言語と互換が高くC言語ができる人ならPHPを知らなくても意味が分かる */ /* C言語からPHPへの移植、PHPからC/C++への移植は簡単。*/ if($argc != 2){ fprintf(STDERR,"テキストファイルの内容を表示します。\n"); fprintf(STDERR,"使い方: php texdump.php 読み込みファイル名\n"); return 1; } if(($fp = fopen( $argv[1],"rt")) == NULL){ fprintf(STDERR,"ファイルオープンエラー[%s]",$argv[1]); return 2; } while(($buf = fgets($fp,2000)) !== false){ printf($buf); } fclose($fp); return 0; ?>


Perlソースコード
#Perlでテキストファイルの内容を表示するtextdump.pl #C言語風に書こうとしているが、あまりC言語に似ない #PerlでのコメントはC言語の/* */もC++の//も使えない。 #最大文字数を指定する一行読み込み関数がないようなので自作 #サブルーチン ファイルを一行読む。改行除く最大文字数指定。 sub fgets{ my $buf; my $fp = $_[0]; my $maxlen = $_[1]; my $cnt = 0; $buf = ""; while (1){ $c = getc($fp); if(!defined($c)){ last; } if($c eq "\r"){ } elsif($c eq "\n"){ $buf = $buf . $c; last; } else{ $buf = $buf . $c; ++$cnt; if($cnt >= $maxlen){ while(1){ $c = getc($fp); if(!defined($c)){ last; }elsif($c eq "\n"){ $buf = $buf . "\n"; last; } } last; } } } if(!defined($c) && $cnt == 0){ return undef; } return $buf; } #C言語のargcは、Perlでは @ARGVと似ない。 if(@ARGV != 1){ printf(STDERR "テキストファイルの内容を表示します。\n"); printf(STDERR "使い方: perl texdump.pl 読み込みファイル名\n"); #main()に相当するreturnを書くとPerlでエラーが出たのでexitで代用 exit(1); } #C言語のargv[1]は、Perlでは $ARGV[0]と添え字の数値がずれる。 #C言語のfopenは、Perlには無い。 if(open($fp, $ARGV[0]) == undef){ #fprintfはPerlには無い。 #C言語風にSTDERRの次にカンマ(,)を付けるとPerlではエラー printf(STDERR "ファイルオープンエラー[%s]",$ARGV[0]); exit(2); } #最大文字数を指定する一行読み込み関数がないようなので自作したfgetsを呼ぶ while(defined($buf = fgets($fp,2000))){ printf($buf); } close($fp); exit(0);


C言語の話


あーすブラウザ
オンライン鍋田辞書
鍋田辞書トップ