foussin分室メインページ
【アマチュア・プログラミングの頁】 (introduction)
ちょっと長めの能書き…
■アマチュア・プログラミングの頁 (2008.06.07 Sat)
#01. プログラミングの魅力:『夢、ロマン、感動』を取り戻そう
このページは、趣味としてプログラミングを楽しむ『アマチュア・ユーザー』のために執筆する。このスタンスを維持することが、何よりも大切だと感じている。本来プログラミングとは、とても楽しい行為だ。自作のプログラムを使って自分のパソコンを思い通りに制御できた時は、パソコンに使われている奴隷ではなくて、自分がパソコンのマネージャー(支配者)になった気分を存分に味わえる。まさに痛快…このひと言に尽きる。
ああ、それなのに、ネット上に書き込まれているプログラミングの話題は、どれも味気ないものばかりだ。書き込みの大半は、プロの SE、プログラマ達によるものだ。しかし、彼らの気持もよく分かる。ソフトウェアの開発を、商業ベースのシビアなスケジュールでこなす…。それが、まず無理な注文だということは、プログラムを組んだ経験がある人なら誰でも察しがつく。原因不明のバグを「今夜中に直せ!」と言われて、即座に「ハイ!」と即答できる人はいないはずだ。
現在、ソフトウェアが社会に及ぼす影響は計り知れない。ソフトウェアの開発には、人命に関わる医薬品の開発と同等の慎重さが必要だ。開発会社はすぐにリリースして利益を回収したいと考えるだろうが、社会への影響力が甚大なソフトウェアには、それなりの『臨床期間』が必要だ。
プロのソフト開発者を憂鬱にさせている要因は他にもありそうだ。オブジェクト指向の普及に伴い、大規模ソフトの開発が花盛りのようだが、筆者の目には、資本主義経済(グローバル社会)を支える歯車の一部品として、開発者を縛るための方便としてオブジェクト指向が利用されている…そのように思えてならない。
オブジェクト指向が『数百万行にも及ぶ巨大プログラム』の開発・保守管理に有利なことは、アマチュア・ユーザーの筆者でも理解できる。が、そんなにも巨大なプログラムは一体、誰のために必要なのかを考えてみると、それは、世界市場を相手に莫大な富を得ようとする一部の企業や国家等であって、一市民にとっては『どうでも良い』気がしないでもない。
ソフトウェア開発を仕事として成立させるためには、いかにしてリスクを軽減できるかが鍵となる。オブジェクト指向の導入は、その解決策として有効な選択肢と言える。それによって実際、稼げる産業として定着しつつあると思う。しかしその代償として、プログラミングが本来持っている魅力が失われてしまっているようにも思える。
プログラミングには、従来では実現が難しかった『個人レベル』でのWebページの発信などをサポートする、新たな可能性も開いている。そこには商業ベースのシビアなスケジュールは存在せず、個人個人が自らの探究心、向上心のおもむくままにプログラミングに熱中している。彼らを熱中に駆り立てるモチベーションとして『一攫千金』への希望も確かにある。が、それだけではない。プログラミングには人を『感動』させる魅力がある。
ソフトウェア産業としてのプログラミングでは、グローバル化を目指し、巨大なコードを制作し、金を稼ぐことによってその人を豊かにする。そんなわけで、プロの開発者にとってのプログラミングとは、仕事を成立させるためのツールにすぎない。そうでなければ、ビジネスとしてのソフト開発は絶対に成功しない。
一方、アマチュアによるプログラミングでは、グローバル化よりもローカル化を重視する。自分が住んでいる地域、母国語圏で役に立つプログラムでなければ、そこで暮らしている自分の役に立つわけがないのだから、当然の帰結となる。プログラミングについて、Web で検索してみると、グローバル化一辺倒の記事ばかりがヒットするが、インターネットは元々ソフト開発者のプラットフォームなので、そうなってしまうのも当然だ。だが、プログラミングは専門家だけのものではないので、ローカル化を重視した地域密着型の、アマチュアによるプログラミング・スタイルも存在する。そこにあるのは、向上心、探究心を刺激してやまない、夢・ロマン・感動に満ちた魅力的なプログラム達だ。
要するに、ビジネスとは別物の、もう一つのストリームが存在する。そっちのストリームのプログラミングは面白い。筆者はそれを伝えたいと思っている。
■アマチュア・プログラミングの頁 (2005.10.19 Wed)
#02. Perl を中心に据えたアマチュア・プログラミングを提唱
Perl に関心を持っている人の中には、
CGIスクリプトを組んで個性的な Webページを表示したい…
ただそれだけが望みであって、Perl 自体について深く理解するつもりは毛頭ない、という人も少なくないだろう。だが、いざ CGI の制作に取り組んでみると、やはり Perl はもちろん、UNIX、Webサーバ、プログラミングの基礎などについて、一通りの知識や操作法を習得しておく必要があることにすぐ気付くはずだ。急がば回れ。…なのである。
当サイトでは、Perl を中心に据えた話題を扱う。Perl は CGI専用の言語というわけではないので、当文書も CGI にこだわらず、一般的なアマチュア・プログラミングの話題について書くつもりだ。
ところで、CGIスクリプトは Perl 以外の言語でも作成可能だ。さらに CGI に限らず、プログラムを作るためのツール(プログラミング言語)は他にも多数存在する。それでも筆者は、アマチュア・ユーザーのための言語として、Perl を使うことを提唱する。なぜ Perl なのかというと、筆者が Perl にハマっているから…というのが一番の理由だが、もちろんそれは、Perl が『アマチュア・プログラマである筆者』を魅了する特長を備えているからに他ならない。どんな特長かというと…
- Perl は「フリーソフト」である
- Perl は「インタープリタ」である
- Perl は「オールマイティなスクリプト言語」である
- Perl は「構造化プログラミングの集大成を成す言語」である
- Perl は「構造化プログラミングの限界」を教えてくれる言語である
- Perl は「ユーザーに対して寛容な言語」である
- Perl は「CGIスクリプトのデファクト・スタンダード」として既に定着している
- Perl は書籍やネット上などに「参考文献等が充実」している
これらはどれも、アマチュア・ユーザーにとっては欠かすことのできない特長だ。もちろん、フリーソフト、インタープリタの言語は Perl 以外にも多数存在する。「ruby」「PHP」「JavaScript」等々…この辺が Perl 以外で有力候補の言語といえる。ただし PHP、JavaScript は Webプログラミングに特化した言語なので、オールマイティとは言えないし、ruby は構造化プログラミングを発展させた『オブジェクト指向』の概念がふんだんに取り入れられていて、初級者にはちょっと敷居が高い。
本職のプログラマや SE ならば、TPO に応じて最適な言語を使いこなす技量と柔軟性が必要だが、アマチュア・ユーザーが様々な言語を隈なく覚えるのは大変な労力となる。たった一つの言語の使い方だけ覚えて、それだけを使いこなせる技量を身に着けた方が効率的だ。
で、オールマイティなプログラミングが可能な Perl をとりあえず覚えておけば、コマンドだって、CGIスクリプトだって、サブルーチン・ライブラリだって、一応作成することができる。元々 Perl は、sed、awk、シェル・スクリプト、C言語のスーパーセットとして発展してきた経緯を持っている。特に正規表現については、現存する多くの言語が『Perl互換』を謳っているほど、その完成度、普及度は高い。というわけで…
とりあえず、Perl。
(Windowsユーザーならば) とりあえず、ActivePerl。
これが『アマチュア・プログラミング』の第1歩だ。Perl を覚えてしまえば、他の言語を習得するのも、さほど困難ではないだろう、と筆者は考えている。
■アマチュア・プログラミングの頁 (2005.12.17 Sat)
#03. 必要最小限の関数、演算子を使ってコーディングする
とりあえず、Perl。…とは言うものの、Perl は膨大な関数、演算子、標準モジュール、標準ライブラリを擁する巨大なシステムを形成していて、それら全ての使い方を覚えるのは容易なことではない。おそらく、本職のプログラマであっても、ほとんどの人は傍に数冊のマニュアル本を置き、調べながらコーディングしているはずだ。本職でもそうなのだから、アマチュアに「Perl の全機能を覚えろ」と言っても無理に決まっている。
しかも、Perl はフリー・スタイルの言語である。ある機能を持つプログラムを作るにしても、作る人によって出来上がるコードは千差万別、十人十色になるだろう。この点が PHP とは対照的だ。筆者は、この自由度の高さこそ Perl を魅力的な言語にしていると思っているが、逆に初級者を混乱させる一因にもなっている。
そこで、この『自由度の高さ』を『習熟レベルに応じたプログラミングが可能』と読み替えて、初級者に対しては敢えて自由度を制限すべきと考えた。一般のアマチュア・ユーザーならば、必要最小限のステートメントだけ覚えてプログラミングした方が効率的なので。筆者自身、Perl の全機能を使いこなす気は毛頭なく、自分なりに取捨選択をしてコーディングしている。
取捨選択の参考例として、2005年12月時点での筆者の『Perl 活用状況』=筆者の『個人的なコーディング・ルール』を以下に記載しておく。
- 【×】使用禁止条件:システム(OS)に依存する関数は極力使わない
- 汎用性重視の理由から使わない事に決めたもので、この条件を守る事によって
Win、Mac、Unix に関わらずに動作するスクリプトが作成可能となる。
使用禁止の関数は以下の通り。
getprotoent, setprotoent, endprotoent, getprotobyname, getservent, setservent, endservent, getnetent, setnetent, endnetent, getnetbyaddr, getnetbyname, gethostent, sethostent, endhostent, getgrgid, getgrnam, getgrent, setgrent, endgrent, getpwnam, getpwuid, getpwent, setpwent, endpwent, shmwrite, shmread, shmget, shmctl, semop, semget, semctl, msgsnd, msgrcv, msgget, msgctl, socketpair, setsockopt, getsockopt, waitpid, wait, syscall, setpriority, kill, getpriority, getppid, getpgrp, setpgrp, getlogin, fork, alarm, dump, symlink, readlink, pipe, link, flock, fcntl, chown, chroot
取捨選択の要点:foussin分室で公開している Perl スクリプトには、上記の関数を使ったものは 1本もない。Unix に特化したスクリプトを作らない限りは、上記の関数群が必要になる事は、まずないだろう。そんなわけで、Perl 初級者は、上記関数の使い方を当面は覚えない方が良い、と筆者は考えている。
- 【○】筆者が頻繁に使っているステートメント
-
- ●制御構造
-
条件分岐処理の構成要素:
if, unless, else, elsif, 及び下記3種類の構文
(条件式) && (実行文); # 論理演算子(単純なif文)
(条件式) || (実行文); # 論理演算子(単純なunless文)
(条件式) ? (実行文1) : (実行文2); # 条件演算子(単純なif〜else文)
取捨選択の要点:筆者が使っている条件分岐のステートメントは上記のみだ。if 修飾子、unless 修飾子は使っていない。それらの修飾子は、しょせん単純な条件分岐でしか使えないものだ。単純な条件分岐なら、論理演算子を使った方がソースをすっきりと簡潔に記述できるので、筆者は if, unless 修飾子を使わない事にした。ただし、論理演算子や条件演算子を使う場合、演算子の優先順位に気を付ける必要がある。が、筆者は優先順位をいちいち覚えるのが面倒なので、( ) で囲む事にしている。
if 修飾子、unless 修飾子は、C言語を習得済みの人にとっては分かり易い構文と思われる。なので、C言語を知らない人は、それらの修飾子は覚えない方が良いと筆者は考えている。
反復処理の構成要素:
while, for, foreach, last, next
取捨選択の要点:筆者は until, redo, continue を使っていない。使わなくても、特に困った事も無いし。
- ●関数(単項演算子)
-
数学関数:
abs, atan2, int, rand, srand
取捨選択の要点:abs は Perl5 から使えるようになった関数なので、Perl4 対応のスクリプトを組む際は除外しなければならない。今のところ筆者は cos, exp, log, sin, sqrt, oct, hex を使っていないが、必要があれば使うべき性質の関数だ。ただ、oct と hex はそれぞれ 0nn, 0xnn で代用できるので覚える必要はないかも。
時間関数:
gmtime, localtime, time
文字列処理・ASCIIコード変換:
chr, ord, chomp, chop, length, sprintf, substr
取捨選択の要点:chomp は Perl5 から使えるようになった関数なので、Perl4 対応のスクリプトを組む際は除外しなければならない。今のところ筆者は crypt, index/rindex, ,lc/lcfirst/uc/ucfirst, pos, quotemeta, study を使っていない。
配列・リスト処理関数:
join, pop, push, reverse, shift, sort, split
取捨選択の要点:今のところ筆者は grep, map, scalar, splice, unshift を使っていない。
splice はランダム・アクセスのプログラムを作成するなら必要だと思うが、シーケンシャル・アクセスのプログラムを組むだけなら、強いて覚える必要はないと思っている。
筆者は unshift( @list, $data ); は使わず、@list = ( $data, @list ); で代用している。こっちの方が分かりやすいし、所詮はアマチュアのスクリプトだ。実行効率をシビアに追求しても仕方あるまい。
map は Perl5 から使えるようになった関数なので、Perl4 対応のスクリプトを組む際は除外しなければならない。
ハッシュ関数:
delete, keys, values
取捨選択の要点:今のところ筆者は each, exists を使っていない。exists は Perl5.005_02 以前ではバグが確認されていて、最新バージョンと古いバージョンでは動作が変わる可能性がある。Perl5汎用のスクリプトを組むなら、exists は使わない方が賢明だ。each は keys, values で代用できるので、強いて覚える必要は無いだろう。
ディレクトリ操作:
chdir, closedir, mkdir, opendir, readdir, rmdir
取捨選択の要点:今のところ筆者は rewinddir, seekdir, telldir を使っていない。
入出力・ファイル操作:
binmode, close, eof, getc, glob, open, print, printf, rename, select, stat, unlink, utime
取捨選択の要点:今のところ筆者は chmod, dbmopen/dbmclose, fileno, ioctl, lstat, pipe, read, readline, readpipe, seek, sysopen, sysread, sysseek, syswrite, tell, truncate, umask, warn, write を使っていない。OS に依存しないスクリプトを組むなら ioctl, pipe, tell, truncate は使わない方が良い。readline, glob, readpipe, sysopen, sysseek は Perl5 から使えるようになった関数なので、Perl4 対応のスクリプトを組む際は除外しなければならない。
実行制御:
caller, die, eval, exit, return, sub, wantarray, sleep
取捨選択の要点:今のところ筆者は do, goto を使っていない。
プロセス操作・システムコール:
times, exec, system
取捨選択の要点:プロセス操作・システムコール関連の関数は、そのほとんどがシステムに依存するため、筆者は上記以外の関数は使っていない。
筆者は system や exec をたまに使っているが、これらの関数は Windows や Perl のバージョンの違い等によって、思い通りに動いてくれない事があるので、使用の際は充分に注意する必要がある。例えば、Windows XP では、『system('コマンド名') を使っている Perl スクリプト』を、バッチファイルから呼び出して自動運転させようとすると、システムコマンドの標準出力を捕捉できなかったり、コマンドが実行されない事がある。system が駄目ならバッククオート文字列(`コマンド名`) にすれば良いと思ったら、これも駄目だった…。これは『Unix システムコール』と『Windows API』の違いに起因する問題と思われる。これらはアマチュア・ユーザーには荷が重い話題で、未だに良い解決策が浮かばず筆者も困っている。
ネットワーク関数:
未使用
取捨選択の要点:今のところ筆者は、ネットワーク関連の関数を一切使っていない。アマチュアには難しい話題なので、覚えなくても良いと思っている。ちなみに次のような関数がある(システムに依存する関数は除外した)。
accept, bind, connect, getpeername, getsockname, listen, recv, send, shutdown, socket, gethostbyaddr, gethostbyname, getservbyname, getservbyport, getprotobyname, getprotobynumber
オブジェクト指向・モジュール関連:
package, require, use
取捨選択の要点:今のところ筆者は bless, no, tie/untie/tied を使っていない。bless, use/no, tie/untie/tied は Perl5 から使えるようになった関数なので、Perl4 対応のスクリプトを組む際は除外しなければならない。
初期化・定義・宣言・判定・変数スコープ制御:
defined, local, my, undef
取捨選択の要点:今のところ筆者は reset, prototype, ref, scalar を使っていない。my, prototype, ref は Perl5 から使えるようになった関数なので、Perl4 対応のスクリプトを組む際は除外しなければならない。
バイナリ変換:
未使用
取捨選択の要点:今のところ筆者は pack, unpack, vec を使っていない。
- ●演算子(オペレータ)
- Perl の演算子には、オペランド(被演算子)を1つ持つもの(単項演算子)、2つ持つもの(2項演算子)、3つ持つもの(3項演算子)、の3種類がある。単項演算子と位置付けているものには、オペランドに式(別の演算子を含む)を指定できるものがあるが、それも結局は式の値に作用するため単項演算子と解釈できる。数学の世界でも、リストを処理する関数はあっても、『多項演算子』(4項とか 5項とか)というものは存在しないんじゃないかな…たぶん。
マッチ演算子(単項演算子):
m//
置換・変換演算子(2項演算子):
s///, tr///
引用符(単項演算子):
"", '', ``
入力演算子(単項演算子):
``, <>
取捨選択の要点:`` をバッククォート演算子(コマンド入力演算子)、<> を行入力演算子、またはファイル名グロブ演算子と呼ぶ。`` のオペランドはコマンド及びその引数で、その機能はクォート風演算子の qx// と全く同じだ。<> は、そのオペランドが『ファイルハンドルなら行入力演算子』、『ファイル名パターンならファイル名グロブ演算子』となるが、紛らわしいので Perl5 以降、グロッビングするなら glob関数を使うことが推奨されている。
クォート風演算子(単項演算子):
未使用
( q//, qq//, qr//修飾子, qx//, qw// )
取捨選択の要点:今のところ筆者は、クォート風演算子を一切使っていない。
算術演算子(2項演算子):
+, -, *, /, %, **
文字列演算子(2項演算子):
., x
数値比較演算子(2項演算子):
==, !=, <, >, <=, >=, <=>
文字列比較演算子(2項演算子):
eq, ne, lt, gt, cmp
取捨選択の要点:今のところ筆者は
le, ge を使っていない。
代入演算子(2項演算子):
=, +=, -=, *=, /=, .=
取捨選択の要点:上記の他にも、代入演算子には次の種類がある。
**=, %=, x=, &=, |=, ^=, <<=, >>=,
&&=, ||=
しかし、筆者はこれらの演算子を使っていない。こんなに多くの演算子を覚えるのは面倒だし、特に ^=, <<=, >>= などは別の演算子と勘違いしそうで紛らわしいため、いっそ覚えない方が良いと思っている。
インクリメント演算子/デクリメント演算子(単項演算子):
++ --
取捨選択の要点:インクリメント演算子/デクリメント演算子には『前置き(++$var, --$var)』と『後置き($var++, $var--)』の2つの記法があるが、筆者は『前置き』の記法のみを使っている。これらの演算子は元々
$var = $var + 1; # または $var += 1;
$var = $var - 1; # または $var -= 1;
の略記法として用意されたものだ。前置きと後置きの違いは『スカラーコンテキストで評価した時』に表れる。++, -- はオペランド(スカラー変数)の値を 1 増減させると共に『戻り値を返す』が、前置きの場合は「演算結果の値」と「戻り値」は同じとなる。++, -- を入力の手間を軽減するための略記法として使っているだけなら、前置きだけ覚えておけば良い。
2項論理演算子:
&&, ||, and, or
取捨選択の要点:今のところ筆者は、xor(exclusive-or:排他的論理和)を使っていない。xor は必ず左右のオペランドの両方を評価する。それに対する xor 以外の上記4つは『短絡論理演算子』とも呼ばれている。and, or, xor は Perl5 から使えるようになった演算子なので、Perl4 対応のスクリプトを組む際は除外しなければならないが、優先順位が低く設定されているため、何かと便利である。
論理否定(INV)演算子(単項演算子):
未使用( !, not )
取捨選択の要点:INV(インバータ)回路は論理回路を構成する最小単位だ。and, or, xor は INV回路を複数組み合わせて実現している。しかし、今のところ筆者は論理否定演算子を使っていない。
ビット演算子(2項演算子):
&, |
取捨選択の要点:今のところ筆者は ^(排他的論理和), ~(否定:ビットの反転) を使っていない。ビット演算子は 2進数の演算なので、一般ユーザーが使う機会はほとんど無いだろう。強いて覚える必要はないと思っている。
シフト演算子(2項演算子):
未使用( <<, >> )
取捨選択の要点:今のところ筆者はシフト演算子を使っていない。シフト演算子は『桁シフト』を行う 2進数の演算で、一般ユーザーが使う機会はほとんど無いだろう。強いて覚える必要はないと思っている。Perl の数値の型は、原則として double(64ビット) に決まっていて、デフォルトでは『符号なし整数』がシフト演算子のオペランドとなる。シフト演算子はプラットフォームに依存する関数なので、移植時には注意が必要だ。
デリファレンス演算子(矢印演算子)(2項演算子):
->
取捨選択の要点:この演算子は、主に『オブジェクト指向』で使う。初級者が覚えるのは時期尚早だと筆者は考えている。筆者自身も、Jcode.pm のメソッドを使う時しか記述したことがない。
パターン結合演算子(2項演算子):
=~, !~
範囲演算子/カンマ演算子(2項演算子):
.. => ,
リファレンス演算子(単項演算子):
\ (厳密には \ 半角バックスラッシュ)
条件演算子(3項演算子):
(条件式)?(実行文1):(実行文2)
補足説明:Perl で唯一の 3項演算子だ。演算子というより、制御構造と呼んだ方が適切な気がする。
ファイルテスト演算子(単項演算子):
-r, -w, -x, -e, -z, -s, -f, -d, -b, -c, -T, -B, -M, -C
取捨選択の要点:上記の他にも、ファイルテスト演算子には次の種類がある。
-o, -R, -W, -X, -O, -l, -p, -S, -t, -u, -g, -k, -A
しかし、筆者はこれらの演算子を使っていない。これらの演算子は Unix 以外のシステムでは意味がないため、汎用性を重視して使わない事にしている。
- ●format(出力制御構造)
-
取捨選択の要点:今のところ筆者は format を使っていない。format はプレーン・テキストを整形出力するための書式制御構文で、BASIC(ひと昔前の言語)の print using文 と似たテンプレート(書式指定文字列)を使用する。これは、プレーン・テキストを直にプリントアウトする『ライン・プリンタ』専用の機能と言えるので、DTP が当たり前となった現在では使用頻度がかなり低くなっている。筆者は、printf、sprintf を format の代用として使っている。
- ●関数以外の項
- 項とは、演算子に対する『オペランド』、関数に対する『引数』、多項式を構成する個々の単項全般(関数も含まれる)を指すが、ここでは関数を除外した単項要素(変数とリテラル)について記載しておく。
変数:
$scalar(スカラー変数), $scalar[](スカラー要素),
@array(配列変数), @array[](配列スライス・ハッシュスライス),
%hash(ハッシュ変数)
特殊変数:
ファイルハンドルごとの特殊変数:
$|
取捨選択の要点:
$| の他に、 $%, $=, $-, $~, $^ という特殊変数もあるが、これらはフォーマット用の特殊変数なので、フォーマットを使っていない筆者はこれらの変数を使っていない。
正規表現用の特殊変数:
$n($1, $2, $3, ...), $&, $`, $'
取捨選択の要点:
筆者は今のところ $+, $* を使っていない。
グローバルな特殊変数:
$_, $., $/, $?, $!, $@, $$, $0, $], $^E, $^F,
$^O, $^S, $^T, $^X, $ARGV
取捨選択の要点:
筆者は $,, $\, $", $;, $:, $#, $<, $>, $(, $), $[, $^A,
$^D, $^H, $^I, $^L, $^M, $^P, $^R, $^W を使っていない。
グローバルな特殊配列・特殊ハッシュ:
@_, @ARGV, @F, @INC, %INC, %ENV
取捨選択の要点:
筆者は %SIG を使っていない(UNIX以外では無意味なので)。
数値リテラル:
12345(整数), 12_345(_による桁区切り), 123.45(実数),
1.23e+10(指数表記), 0xff(16進数), 0123(8進数)
文字列リテラル:
'string'(シングルクォート文字列), "string"(ダブルクォート文字列),
`string`(バッククォート文字列)
ダブルクォート文字列用のメタ文字:
\a(alert/bell/beep), \b(back space), \e(esc),
\f(formfeed), \n(newline), \r(return), \t(tab), \0(null),
\033(文字コードを8進数で指定), \x7f(文字コードを16進数で指定),
\cM(コントロールコード), \u, \l, \U, \L, \Q, \E
取捨選択の要点:
Windows NT/2000/XP では『VT100制御文字』が使えない(空白文字は使える)。\a, \b, \e がそれに該当する。当然、エスケープ・シーケンスも使えない事になる。Windows XP で制御文字を使いたい場合は Win32::Console.pm モジュールを使うしかない。が、このモジュールは ActivePerl5.6 以降でしか使えないので、動作環境はかなり限定される。
※『Windows XP サービスパック2』を最新版にアップデートし、さらに ActivePerl5.8.6.811 以降をインストールすると、\a がベル音としてちゃんと機能する。このことを筆者は、つい最近になって確認した。いつの間にかフィックス(修正)されたらしい。それが Windows XP の修正によるものなのか、ActivePerl の修正によるものなのかは不明だが、どちらかの仕様が微妙に変更された事は間違いない。
正規表現用のメタ文字:
.(改行以外の任意の1文字), *(0文字以上), +(1文字以上), ?(0-1文字), ^(文字列の先頭), $(文字列の末尾), \(メタ文字のエスケープ), |(選択=論理和), ()(グループ化), [](文字クラス), {}(量指定子)
正規表現でのリテラル表現用のメタ文字:
\cX(制御文字), \a, \n, \r, \t, \s, \S, \b, \B, \xnn(文字コードを16進数で表す), \0nn(文字コードを8進数で表す), \0(ヌル文字), \1 .. \9(後方参照), \d(数字), \D(数字以外), \w(word), \W(word以外)
取捨選択の要点:筆者は、正規表現パターンの中では \e, \f, \l, \L, \u, \U, \Q, \E, \A, \Z, \z, \G を使っていない。\l, \L, \u, \U, \Q, \E, \A, \Z, \z, \G は Perl5以降から正規表現パターンとして使えるようになったメタ文字なので、Perl4対応スクリプトを作る際は除外しなければならない。
\w, \W は、Perl のディストリビューションによっては実装に違いがある。例えば jperl for MS-Windows では、\w は [_a-zA-Z0-9] ではなく、[_a-zA-Z] になっているので注意が必要だ。
正規表現の拡張構文:
未使用
取捨選択の要点:今のところ筆者は、正規表現の拡張構文を使っていない。拡張構文は Perl5.005以降から実装されたものなので、Perl5.004以前対応のスクリプトを組む場合は除外しなければならない。ちなみに、拡張構文には次の種類がある。
(?:pattern), (?imsx-imsx:pattern), (?=pattern), (?!pattern), (?<=pattern), (?<!pattern), (?>pattern), (?{code}), (?>pattern), (?(条件)pattern1|pattern2), (?(条件)pattern), (?imsx-imsx), (?#comment)
特殊リテラル:
__LINE__, __FILE__, __END__, __DATA__, __PACKAGE__
グローバルな特殊ファイルハンドル:
ARGV, STDIN, STDOUT, STDERR, DATA, _
環境変数:
HOME, LOGDIR, PATH, PERL5LIB
取捨選択の要点:筆者は PERL5DB, PERL5OPT, PERLDB, PERLLIB を使っていない。
その他の項(リテラル表現):
ヒア文字列(ヒアドキュメント), リスト(スカラー値の集合), ファイルハンドル, ディレクトリハンドル, 型グロブ
- ●筆者が自作スクリプトで利用しているモジュール、汎用ライブラリ
-
Perl には膨大な数の標準モジュール、標準ライブラリが実装されている。その中には便利なプログラムも多数あると思うのだが、ほとんどのドキュメントは英語で書かれている。典型的な日本人である筆者にとって、英文ドキュメントを読破して必要なモジュールを探すのは面倒な作業だ。
また、標準モジュール、標準ライブラリ以外にも、便利な汎用モジュールやライブラリ・ファイルが大勢の日本人有志によっても提供されている。しかし、モジュールに頼りすぎてしまうと自身のスキル・アップを阻害する原因になってしまう。自作できるものは自作し、自分の手に負えないものだけ既存のモジュールを使うスタンスが望ましいと考えている。
そんなわけで、今のところ筆者は jcode.pl, Jcode.pm, Cwd.pm, Win32.pm, Win32::Console.pm の計5本のモジュール、ライブラリしか使っていない。
※( )内は Perl の対応バージョンを示す。ap は ActivePerl の略。
Perl 標準モジュール(*.pm):
Cwd.pm(Perl4以降)
※『Perl標準モジュール』は通常 C:/Perl/lib にインストールされている(Windowsの場合)。
ActivePerl 標準モジュール(*.pm):
Win32.pm(ap5.6以降), Win32::Console.pm(ap5.6以降)
※『ActivePerl標準モジュール』は通常 C:/Perl/site/lib にインストールされている(Windowsの場合)。
標準ライブラリ(*.pl):
未使用
汎用モジュール(*.pm):
Jcode.pm(Perl5以降)
汎用ライブラリ(*.pl):
jcode.pl(Perl4以降)
まとめ:筆者が使っているステートメントは、上記の赤字部分だけだ。おそらく、Perl の全機能のうち半分も使っていないと思う。とは言うものの、それでもかなりの分量がある。初級者に対して「ここに記載したステートメントを全部覚えろ」と言うのは酷な話だ。もちろん全て覚える必要はない。少しずつ使いこなせるステートメントを増やしていけば、それで良い。それについては筆者がとやかく言うよりも、Perl の生みの親である Larry Wall 氏が、ある本の序文で素敵なメッセージを寄稿しているので、その一部を引用し、本文の結びとさせていただく。
…(中略)…君たちがこれから踏み込んでいくのは,決して容易な道ではない。君たちは新しい言語を学ぶのだ――この言語は,聞き慣れない呪文や古くから伝わる歌に満ちあふれている。そのうちのあるものは易しく,あるものは難しく,多くのものは懐かしい響きがあり,また中には今まで耳にしたこともないようなものもあるだろう。途中でくじけて,投げ出してしまいたい誘惑にかられるかもしれない。しかし,君たちが自分の母語を学ぶのに,どれだけの時間がかかったかを考えてみて欲しい。それだけの時間をかけるに値しただろうか? 私は値したと思う。君たちはもう母語を学び終えただろうか? 私はまだ学び終えていないと思う。だから,Perl の神秘のすべてを――まるでピーナッツやオリーブを食べるように――あっという間に学んでしまえるとは期待しないで欲しい。むしろ,例えば,バナナを食べるようなものだと思って欲しい。これはどういうことか考えてみよう。バナナを食べる時には,まるまる1本を食べ終わらないうちに,その味を楽しむことができる。もちろん,そうだろう。一口食べるごとに,そのおいしさが五臓六腑にしみわたるだろう。そして一口食べることが,さらにもう一口,もう一口と食べ進むきっかけとなるだろう。…(後略)…
がんばって学ぶように!
Larry Wall
1993年9月
出典:『初めてのPerl』(Learning Perl 邦訳版)
1995年 6月16日 初版発行
1996年12月10日 第6刷発行
著者…Randal L. Schwartz
訳者…近藤嘉雪
発行…ソフトバンク株式会社 出版事業部
…『序文』より引用しました。
※通称『赤リャマ本』…現在では改定され、『青リャマ本』? となって、
発行元も『オライリー・ジャパン社』に移行し、刊行されている。
■アマチュア・プログラミングの頁 (2010.07.28 Wed)
#04. アマチュア・スタイル! の編集指針について
foussin分室では、次の 3つのスローガンを提言している。
- アマチュア・スタイル! (amateur style)
- That's the Japanese Way !!
- 『車輪の再発明』をしても、気にしない
amateur style …直訳すると『アマチュア風』となる。アマチュア風と開き直ってしまえば、誰もが気軽に自作スクリプトを公開できるのではないか…そう考えて決めた題名だ。
That's the Japanese Way!! …『これが日本流だ!!』という意味になる。この文は foussin分室の Top Page にも記してある。大上段に構えた…とは思わないで欲しい。筆者が言いたいのは、アマチュア・プログラミングとは地域に密着した『ローカルなプログラム』を作ることに他ならない…つまり、日本人(=自分)のためのプログラムを作る…そういうこと。
UNIX の世界(もしくはプログラミングの世界)には、車輪の再発明はするな…という格言がある。どういう意味かをここで詳しく説明する気はないが(Web で検索すればたくさんヒットするので)、既にあるものなら、それを使え…同じものを幾つも作るな。新たに作るならコンパクトに作れ。…そんな意味で使われている格言らしい。なるほど、的を射た、説得力のある格言だと感心する。
しかし、この格言をアマチュア・ユーザーにまで押し付けてしまうのは、ちょっと酷な話だろう。既にあるものが、自分のスキルでは使いこなせなかったり、それを改良するために、更なるスキルアップが要求される場合、やはり自分で一から作ってしまう…というのはアリでしょう。
第一、必死になって英文ドキュメントを読破し、既にあるプログラムを使うのと、自作スクリプトを作って使うのでは、効率を考えると大差はないと思う。日本人ユーザーは、ローカライズのハンデキャップも背負っているのだ。もっと気楽にプログラミングしても良いはず。最近の『ツイッター』や『ブログ』の内容を見てみなよ。どうでも良いような駄文を、せっせと外部ストレージにログとして蓄積し続けている…。人間から『無駄』を取ったら、何も残らないのではないか…筆者は最近、そんな風に感じはじめている。
無駄にしか見えないゴミの山の中にこそ、
重大な秘密が埋もれている…。
かくて foussin は、アマチュア・プログラミングを支援するためのサブルーチン・ライブラリを制作している。もちろん日本語処理ルーチンも用意した(明らかに、車輪の再再再…発明? 発明は大袈裟だけど)。それを、この場で公開しようと思っている。もちろん、アマチュア風…気軽に公開したい。
foussin は、一般ユーザーでも臆することなく、もっと積極的にプログラミングに関わって良いと思っている。しかし、本格的なプログラムを作成するには、『初期設定』『入力』『演算』『出力』『終了処理(環境復元)』など様々な処理を記述する必要がある。これは、アマチュアには負担が大きすぎる。その負担を少しでも和らげることができれば…そう思って作成したのが『アマチュア・スタイル!』で公開したサブルーチン・ライブラリだ。うまく活用してもらえれば、作者も嬉しい。
■アマチュア・プログラミングの頁 (2010.09.12 Sun)
#05. Perl に愛を !
Yes の『Don't Kill The Whale』(邦題:確か『鯨に愛を!』だったはず)を聴きながら、これを書いている。で、この題名(安直だね)。
Let's Work!! …そんな気分の時に、この曲を聴くと、なぜか仕事がはかどる。個人的なジンクスなんだ。
foussin は捕鯨反対派ではない。ただ、音楽として好きなだけだ。終戦後の食糧難を、鯨肉のお陰で日本人は乗り切ることができた(安価で良質の蛋白源だった)。しかも、繊維状のスジ肉なので、噛み切るには頑丈な顎が必要だった。大袈裟だが、椰子の実を噛み切る感じ…。当時の日本人は、顎、歯、胃腸が非常に丈夫だったはずだよ。
また、鯨を 1頭取ってくれば『大洋ホエールズ』という球団が 1年間(?)維持できた…これは以前、TBSテレビ『がっちりマンデー』に大洋水産の社長が出演した時に、社長がそう言っていた。日本人にとって、鯨肉は『懐かしき良き時代』を象徴するノスタルジックな存在になりつつある。
ま、無駄話はこの辺でやめよう。
かつての MSX-BASIC のように、今、Perl は時代遅れの言語として軽視されることが多くなってきている。プログラマの興味、トレンドは PHP や Python (パイソン) に移行しつつある。しかし、foussin はこれらの言語が好きになれない。Perl の方が好き…その理由は、Perl の方が、自然言語(日本語とか)に近い曖昧さがあることだ。前後の文脈(コンテキスト)次第で、Perl コードの意味は一変することがある。が、それはユーザーの意図したとおりに解釈される場合がほとんどだ。こんな仕様は、従来の C言語ユーザーには『奇異』に映ったと思うが、同時に新鮮でもあった。
プログラミング言語にとって曖昧さは『欠点』と言えるかもしれない…。PHP や Python では、その欠点を可能な限り排除することに成功している。知っている人なら想像がつくと思うので、ここでは詳細は書かない。
Perl には確かに欠点があるが、アマチュアにとってそれは取るに足らないことだ。Perl には、それ以上の長所があるのだから。最大の長所は、一般ユーザー向けに執筆された参考文献が、非常に充実していることだ。
普通、プログラミング言語の書籍は、プロの SE やプログラマ向けに執筆されることがほとんどだ。つまり『専門書』の扱いとなる。だが、Perl の場合、一般ユーザー向けに書かれた本が類書と比べると多い傾向がある。その最大の理由は、Perl が CGI スクリプトとしてデファクトスタンダードの地位を獲得したことにある。
現在、普通のパソコンユーザーでも、ホームページを作って情報発信している人はたくさんいる。で、CGI スクリプトが組めるようになれば、さらに個性的な Web ページを作ることもできる。そんな訳で、『一般ユーザー向けの CGI スクリプトの本』への需要が発生した。簡単に CGI を実現するなら、1つの言語に絞って解説、習熟するのが、執筆者にとっても読者にとっても一番簡単だ。そこで、Perl の出番となった。
1つの言語が登場し、それが一般ユーザーにまで浸透するには長い時間が必要だ。専門知識を持たないアマチュアが、新しい言語に飛びついても、分かり易い参考文献がないため、非常な苦労を強いられる…それが現実だ。
しかし Perl は、Perl 1 (1987年12月)の登場から既に 20年以上の歴史を持つ。Perl 5 (1994年10月) にしても、リリースから 16年に達しつつある。この歴史の中で、Perl を使うためのインフラは完全に整備されている。これを、時代遅れの一言で捨ててしまうのは、あまりにもモッタイナイ話だ。
アマチュアが Perl 5 を使いこなすのは、これからが本番なのだ。最新版の Perl 5.12 では、いよいよ『2038年問題』に対応した。Perl 5 の寿命は、まだまだ尽きない。