Perlはワンライナーにも書き捨てスクリプトにもオブジェクト指向の大規模プログラムにもなり得る非常に柔軟性の高い言語です。 様々な需要に耐えうる幾度もの拡張を繰り返しながらも整合性を保ったこの希有な言語の根底を支えるのは、やはり開発者Larry Wall氏の類い希なる感覚だと思います。 というわけで、この書き捨てやすさ(もちろん褒め言葉。おおまかには書きやすさの意味だが、よりPerl的なもの。)を支える具体的なものはなにか、まあ要はずぼらを手助けするセクションはどこかというのをちょっと考えたメモをここに。
package main;でよかった
速記性を保ちながらのオブジェクト指向化について、このpackage文の定義について言及しないわけにはいかないでしょう。
一行のpackage main;
からはじまる名前空間(クラス)の定義は、たとえばオブジェクト指向の雄、Java等と比べるとその特異性が分かるでしょう。
- Perlの場合
-
package Hello; print "Hello, world!\n";
- Javaの場合
-
public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } }
なにが違うかおわかりでしょう。main関数の定義もさることながら、package
(=class
)の定義の仕方が根本的に違います。
もしpackageの定義がpackage main {...}
だったならばと考えると、全く恐ろしい(Perl5.1.4からブロックでも記述できますが)。
- ifの世界の場合
-
package Hello{ print "Hello, world!\n"; }
開始、そして終了のブレースが追加され、それに引っ張られる形で必然的に「正しいコーディングスタイル」を保つためにはパッケージのあらゆる行にインデントを付加せざるを得ないでしょう。
myでよかった
また細かいずぼらな話ですが。my
もまた、変数の局所化を実現するという重要な役割を果たす文です。
これがPerl4までのlocal
のみの環境へour
とともに追加されたその当時にはすでに、C++が現在多くのオブジェクト指向言語で使われている局所化のキーワードを備えていました。
すなわち、public
、private
、protected
。これらとPerlのour
、my
、local
は用法的に近いところにあります。
さて、と。
- ifの世界の場合
-
sub hoge{ private $self = shift; private $flag = 0; ... }
怖いわぁ……。そういえばsub
だって、subroutine
の略だもんね。Larry Wallたんの言語感覚に脱帽するばかり。
そして、暗黙でよかった
まあなんといってもPerlの速記性を担保するのは偉大なる特殊変数$_
の存在でしょう。
ほかにも@_
やら<>
やら色々存在しますが、やはり代表されるのは$_
にちがいねぇ。
$_ = "hogehoge hogehuga aaa khogec";
とかで-
print join "\n",map {/(hoge.*)/} split / /;
出力はもちろん"hogehoge\nhogehuga\nhogec"。たぶんCとか的に書いたら下のようになる。
- 冗長な場合
-
my @data = split(/ /,$_); my @data2; for(my $i = 0; $i <= $#data; $i++){ if($data[$i] =~ /(hoge.*)/){push(@data2,$1);} } print join "\n",@data2;
さて、そんなわけでPerlはいいものです。みんなつかってみよう!
明らかに尻すぼみ
Edited by Narazaka 2011/02/11