Perlの食えない事情

Perlの食えない事情
@author: KaPoKoN
  1. Perlは初心者おすすめの言語ではない
  2. 奇妙な演算子の数々
  3. 奇妙な宣言文の数々
  4. 最後に・・・

 これを書くに至った経緯は、Perl言語の創始者が本来のPerlの使用目的とは 遠く離れた言語になってしまった背景。 自分がC、PHP、Java、VBとたんたんとやってきた中で、 これほど奇怪な仕様の言語に巡り合ったのは初めてであるという事だ。 そして、パール信者は叫んでたまらない。

パールisGOD!

パールisキング!

・・・と。 確かに今までのウェブは、そのように進んでしまったという事実があるが、 パールは本来はウェブアプリケーションのサーバー処理をするために書かれた言語ではない。 UNIX上でデータを扱う為に作り出された言語であり、 UNIXそのものがサーバーとして作られたOSであるがゆえ、 ウェブでユーザーからの情報を編集・保存する言語にたまたまPerlがあっただけなのである。 しかも、言語として未完成な段階で採用されていったため、 結局、それがバージョンアップごとに様々な問題を起こすようになってきた。 また、後から新しい規格を変則的に無理やりくっつけているため、 現在、このPerl言語をマスターする意味がほとんど皆無といってよい。


Perlは初心者オススメの言語ではない

 昔、ある掲示板で「PerlをマスターしてからPHPをやる」などと言っている輩が いたが、「本気かと?」コンパイラやエラーメッセージのモジュールを導入したり、 奇怪な処理や今後は役に立たないであろう仕様を覚える気なのか?と・・・。 正直に言えば、Perlは覚えても今後は意味の無い言語である。 頭から消しても何も問題ない言語であろう。PHPを覚えれば、 C/C++やJava、そしてPerlと繋げられるのに対して、 Perlにはその糸すら存在しない。PerlからPHPは、逆に抵抗感を持つのがおちだろう。 だから、初心者に勧めるべき言語は他ならぬPHPなのである。 PHPはmod_phpを導入するだけで、コンパイルおよびエラーの表示などを やってくれるのだから。 それにC、Javaをある程度深くやってきた私には、このPerlという言語は 早い時期に撲滅する事が大事な言語だと思う。 熱狂的なPerl信者が生まれる背景等をプログラム初心者にも分かりやすい視点で 説明していこうと思う。


奇妙な演算子の数々

 プログラム言語を考える時、演算子と呼ばれる概念が必ず付いて回る。 関数との違いは演算子は独特の概念を要するものであり、 演算子の数は極力少なく、そして覚えやすいもの、分かりやすいものが 良いプログラミング言語である。 もし、コンピュータ上で難しい機能を使おうと思うなら、 それは関数やメソッドを使用すべきであり、 演算子という分かりにくいやり方はしない方が極力いい。 じゃー、演算子と関数の違いは?という思うかもしれないが 要するに式か文かの違いである。Perlは、 そのほとんどを式で全てを解決させようとした言語である。 これはPerlがデータを扱う事を主眼として作られた言語である事に他ならない。 式なくしてPerlマスターはあり得ないのである。 ところがWeb系のプログラムに、このような式優先のやり方が果たして最善なのか? と言えば「う〜〜〜ん」と唸らざる終えないw。 では、その奇妙な演算子の数々を一通り紹介していこう。


奇妙な演算子1(文字列演算子)
奇妙な演算子2(範囲演算子)
置換演算子:s///
文字列を簡単に変える事を目的に作られた演算子です。
Perl

while(<STDIN>)	#<STDIN>はファイル入力を指します
{
s/&#160;/&nbsp;/g;
#&#160;を&nbsp;に変換します。 print;
}

このPerlプログラムはPHPの以下のプログラムと同等の意味を持ちます。
PHP

strtr($_POST['honbun'],"&#160;","&nbsp;");	//strtr(対象変数,変換前,変換後);
echo($_POST['honbun']);
どちらが簡単か?分かりやすいか? というのは人それぞれによるかもしれませんが、私はPHPです。 また、話の順位がややこしなくるからここでは触れませんが、 Perlでは単語(2文字以上の文字は)s///を1文字の場合はtr///演算子と 分けて使用しなければならない点も付け加えておきましょう。
結合演算子=~ !~

s///やtr///の置換演算子は$_変数以外適用できない仕様になっています。 $_はデフォルトで入力のパターンマッチ対象になる特殊変数のことで、 これ以外で置換演算子を使おうとするとエラーになります。 これを式上で防いでくれるのが結合演算子です。使用例を挙げてみましょう。


$str =~ tr/0-9/a-i/g;	//こういうやり方でなければ他の変数に置換演算子は使えません。

ダイヤモンド演算子<>

 前途した説明で、Perlの仕様が分からなければ、辞めた方がいいです。 PHPに移りましょう。何回も言いますけど、Perlは式を元に 構築されたプログラミング言語で式さえ得意であればPerlは向いているのかもしれません。 しかし、私たちが日々の生活を送る上で日常的に式を使う事などあるのでしょうか? 次に見せるのがダイヤモンド演算子と呼ばれる演算子です。 ええ、ぶっちあけ、もうここからは何でも出てきますよw。


print <>;

 UNIXコマンドにcatと呼ばれるものがあります。 これはファイルの内容を表示するもので、 上記のプログラムは、そのcatコマンドと同様の働きがあります。 これは、<STDIN>のSTDINが入力処理を表すのに対し。 <>は対象がないものですから、 この中にあるファイルの中身をリストにして渡します。 分からないなら、今の時代、覚える必要がないでしょう。 PHPではfile()関数とlist()関数を覚えればいいですし。


マッチ演算子/name/
/name/の//で囲んだnameをファイル中から探し、 そこの行だけを返す演算子です。
宇宙船演算子<=>

$a = $b <=>$c;

これは、$bと$cを比較し、もし$bが$cより大きい場合は-1を返します。 つまり$aの値が-1になるわけです。そして等しければ0を、$bより$cの方が高い値を 取っている場合は1を返し$aに代入します。 PHPでは宇宙演算子なるものは存在しませんが、 strcmp()関数やmax()、min()関数等を使用すれば、 これらの演算子よりも複雑なデータ構造では 簡単に値を見つける事が出来ると思います。 また、宇宙演算子を文字列の比較に応用する場合は、 <=>をcmpに変えて比較せねばなりません。 演算子の部分は、ここら辺にしておきましょう。 実際、まだ奇怪な演算子がPerlにはゴロゴロしております。 これも、全て式で解決しようとしてきた言語だからなのです。 元々、データを抽出するための言語ですから、式のみで良かったのかもしれません。 ところが、この奇怪な演算子はPerlを覚える者の巨大な壁となりました。 それを汗水たらして熱狂的なPerl信者達は覚えていったのです。 そして、彼らは口々に言いました。


「Perlは史上最高の言語だ」
「Javaより凄い!」
「Cより出来る!」
「PHPはぬるぽ!」

 彼らは2chなどで上級者や初心者を自演し、他の言語を罵りあうのです。 それもPerlのみでしか開発しなかった彼らが他の言語を覚える時に 大きな言語障害になってしまうがゆえなのでしょう。 私はC、Java、PHPで、まーそれなりにやってきましたが、 Perlは初心者にオススメすべき言語ではないと大々的に言えると思います。 現在ではDB鯖や、ウェブ全体を囲む環境が目まぐるしく変化するなかでPerlだけが 取り残されている言語になっていくと思います。 もともと自然消滅せざる終えなかった仕様だったのだろうと今なら実感できるからです。

奇妙な宣言文の数々

 未熟言語Perlは、PHPと比較してプリミティブ型と文字型の境界線を 大きく引いてきました。そして、それは使われる演算子を複雑化し、 見るものを寄せ付けない。サーバーサイド技術がマニアな世界に 変貌していく大きなきっかけになっていったと思います。
 確かにPHPには型による区別を極力無くしてきた言語です。 しかし、CやJavaなどと比べPerlの方が極力型を意識しない言語仕様 になっているというのは認めざる終えません。 例えば3項演算子の仕様が若干違う部分もあります。 例を挙げるとCやJavaでは、



int i;
i = (g==5)?0:1;

 このようにiには同じ型以外のものは入らないような構造になります。 しかし、Perlはこれが0の代わりに"零"という風に 文字列を代入する事が出来てしまうのです。 PHPはPerlユーザーがPerl以外の言語にも慣れるよう極力Perlの仕様を 持ってきたように思えます。これは、Web上で浸透しすぎたPerlが こんごの将来を占う言語では劣化性が指摘されるがゆえなのだと思います。

配列

配列の扱いもCやJavaより複雑化しています。 まず、その宣言文を見てみましょう。


$array[0] = 0;
$array[1] = 3;
$array[2] = 9;
$array[3] = 5:

 ここまではPHPユーザーにも分かると思います。ではPHPのarray()関数のように 一気にリスト構造化する配列を作る場合は、このように宣言します。


@array=(0,3,9,5);
連想配列

 これで先ほどの文と同じ配列構造が出来上がりました。 $の代わりに@を使用するのです。 PHPの配列は連想配列なのでarray();で宣言すれば、どんな変数でも配列になります。 ではPerlで連想配列を使うにはどうしたらいいのでしょうか? 以下のように宣言します。


%array=qw(
name sato
age 24
);

今度は@ではなく%を使用します。そしてqwという連想配列を生成する 関数をここで始めて使用するのです。 ちなみにご存知かと思いますが以下のPHPプログラムと同様の意味を持ちます。


<?php
$array = array(
"name" => "sato"
"age" => "24"
);
?>

PHPでは連想配列しかありません。他にはオブジェクト型配列などもありますが これも同様に連想配列の一種です。というのも例えば


$array[0]=4;
$array[1]=3;
$array[2]=4;

とあった場合、unset($array[1]);とし$array[1]の値とアドレスを消去したとしましょう。 そうなると、プログラマの頭の中では$array[0]=4、$array[1]=4と言う風になるかも しれませんが、この場合は$array[0]=4、$array[2]=4という風な連想配列ゆえな 位置を取っています。、 配列を覚え、更に連想配列を覚えるというプロセスは、 プログラム初心者に大きな負担を与えると思います。 何度も言いますが、文による概念が人間に分かりやすいというのは明白なのです。 サーバーサイドで求められている部分は、ユーザーの入力をいかに安全に早く正確に クライアント側に転送できるかにあるのですから、 不必要な概念を取り残すより、使える概念をどのように分かりやすく書くかが 大事だと思います。そのため、PHPでは、たくさん関数やエイリアスを用意してきました。 また、膨大にあるがゆえに関数同士の結びつきが強く、全てを覚えなくても 大丈夫な構造になっています。

自作関数宣言文:sub

 ユーザーによる自作関数はよく目にすると思います。 例えば、広く使われているJavaScriptなどでは、



function zisaku(var x,y)
{
	return x*y;
}

とすれば一つの自作関数が出来上がります。 で、PHPでもこのfunctionを使うし、javaやcなどでは 返す型を宣言し、


String zisaku()
{
	return "I am ZISAKU";
}

と、これでメソッドや関数が出来上がるわけです。 勿論、変態言語perlもありますがfunctionは使用しません。 代わりに「sub」を使用します。


sub zisaku()
{
	return undef;	#perlではnullはundef;
}

 サブ、なんか自分の作った関数を侮辱されているように感じるのは私だけでしょうか? 他にSubで自作関数を作る言語にはVBがありますが、VBではFunctionも使用できるため 結局、Perlの自作関数の宣言だけSubという部分がまた頭を傾げてしまいます。  また、他の言語ではサブは特別な意味を持つ事が多く、例えばサブクラスとか・・・。 サブメソッドとか・・・そして Perlがサーバーサイドプログラムの入り口である以上、 サーバーサイドの技術を習得するのにみんな必死になって覚えようとするわけです。 それで世間でASPやPHP、JSP、CURLなどが出てきてもPerlユーザーは必死に Perlのみを使い覚えるわけです。そして「愛してやまないPerl」と唄い続けるわけです。 Perlプログラマが他の言語に移行する時、いつもお怒りになるわけです。 なぜSubじゃないんだぁ!?なぜクラスなどというややこしいものがサブなんだぁ!! ・・・と。

packageの意味の違い

 packageという宣言文があります。Javaではpackageは、ファイルやディレクトリを あらわしますが、Perlではクラス宣言になります。ややこしいですね。 そしてPerlユーザーはJavaに入ってくるなり、その言語障害にまたもや泣き寝入りする ハメになるのです。

特殊な変数達

 自分はPerlを未来に残そうというか、本来のPerlの姿に戻すべきだと思います。 もっとシンプルにして、スッキリし、そして万人が使いこなすような仕様に 書き直すべきでしょう。プログラムを一か十まで作ると膨大な時間を消費します。 Perlは今の時代で典型的な古典言語なので、この一から十までのプログラムを 書かねばなりません。人間が口で言うのは簡単でもプログラムで書くのは 難しい事がよくあります。例えば先ほど紹介したPHPのmax()とmin()関数を挙げてみると この関数で囲まれた0〜9までの値があったとしましょう、max()関数なら 9を返し、minなら0を返します。これは人間の視覚的に考える事で分かっているのです。 しかし、Perlでは、これにソートや再帰という概念を持ってこなければ成立しません。 Javaなどではいち早くこの概念を持ったオブジェクトが導入されました。 (Javaの場合、機能の変化が目まぐるしいので何のオブジェクトか?っていうのは言及できませんが) つまり、記事を10件表示したり(ページング)、分類別に仕分けするなどの作業を コンピュータ上で実行するにはソート再帰という概念が重要な位置を示していたわけです。 しかし、PHPはあまりこのソートという概念を必要としないようなつくりにもなっているわけです。 全ての概念(アルゴリズム)は、関数という人間にとって扱いやすい「魔法の杖」 としてパッケージ化されたのですから。 悲劇のPerlユーザーは難しい概念が出る耽美に(人間が頭で考えるのは簡単だが コンピュータでそれを実戦する場合は難しい場合) を全て自分の頭で消化し、血反吐を吐くような努力のすえ、 ようやく掲示板などというものを公開してきたと言えます。 だからこそ、簡単にサーバーサイド技術が表現出来てしまう PHPに対してこう叫ぶのです、「PHPぬるぽ」と・・・。 Perlの難しさに代表されるのは、次に紹介する奇妙な変数達がたくさんある点だといえます。 しかも。困った事に今後も増えていく意向だということです。 もう勝手にして下さい。


$`,$&,$'

/*/マッチ演算子で$`にはマッチする前の状態が格納されています。 $&にはマッチした文字列、そして$'にはマッチした後の文字列が代入されるのである。 また、$`は$PREMATCH、とも代用できるみたいです。 他の奴もありますが、ここでは余り紹介いたしません。

$.

$.変数には現在の行番号が格納されています。 また$.は$NR(他もありますが面倒なので紹介しません)とも書く事が出来るみたいです。


$#

$array[$#array]とする事で最後の配列のインデックス(キー)が入るようです。 関数で出来ますよね。


$_

型に左右されず、色々なものが入る変数を宣言する時、上のように書くようです。 また、$_は$ARGと書く事もできるようです。


$0

$0は現在実行中のプログラムが入るようです。PHP_SELFと同じような感じですかね。

最後に・・・

 昔の人はとても頑固モノである。例えば「今の若いモンは鉛筆も削れんのか!」と 嘆いた唄い文句が過大評価されました。しかし、文明の発達は止まりません。 シャープペンシルが出てきました。そして彼らは口々に言うでしょう。 「便利な時代になったもんだなぁ・・・」と。

 日本人は、構造的に大衆の意見にのまれやすい価値観を持っています。 その方が日本の中では上手く生きていけるというのが、なきにしもあらずだからです。 しかし、どうでしょうか本当に上手く生きているのでしょうか? 誰かが「あ」と言えば自分も「あ」と言ういき方が果たして正しい生き方なのでしょうか? 勿論、上のような違いを見てもPerlをやりたいという方は止めません。 是非、挑戦しましょう。

Back Topic Home Next
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]