package Acme::Japarl; # Acme::Japarl - Perlと日本語のコラボレーション # このモジュールは UTF-8 で書かれています。 use Filter::Simple; use utf8; use base qw(Exporter); our @EXPORT = qw( 出力 帰還 脱出 分割 結合 逆転 反復 倶列附 地図 改行 もし ならば あるいは しからずんば なら それとも そうでなければ しからば ); our $VERSION = 0.01; my $icode = 'euc-jp'; my $ocode = 'shiftjis'; FILTER { $_ = "use encoding '$icode', Filter => 1; use utf8; binmode(STDOUT,':encoding($ocode)'); " . $_; utf8::decode($_); }; sub import { my $class = shift; $icode = shift if(@_); $ocode = shift if(@_); local $Exporter::ExportLevel = $Exporter::ExportLevel + 1; $class->SUPER::import(); } # # sub 改行 () { "\n"; } sub 反復 (&\@) { my ($sub,$arrayref) = @_; for ( @$arrayref ){ $sub->(); } } sub 地図 (&@) { my ($sub,@list) = @_; CORE::map {$sub->()} @list; } sub 倶列附 (&@) { my ($sub,@list) = @_; CORE::grep {$sub->()} @list; } sub 出力 (@) { CORE::print(@_); } sub 分割 { my ($regex,$str) = @_; CORE::split(qr/$regex/,$str); } sub 結合 ($@){ my ($str,@array) = @_; CORE::join($str,@array); } sub 逆転 (@) { CORE::reverse(@_); } sub 帰還 { CORE::return(@_); } sub 脱出 { CORE:exit(@_); } # # CONDITION STRUCTURE # sub もし (&@) { my ($cond,$obj) = @_; if( $cond->() ){ return $obj->ifcode(); } else{ return if(!$obj->elsif); return $obj->elsif->ifcode() if($obj->elsif->isa('Acme::Japarl::_ELSE')); } while( my $elsif = $obj->elsif ){ if( $elsif->cond ){ return $elsif->code(); } else{ $obj= $elsif->elsif; last if(!$obj->has_cond); } } $obj->code() if($obj->has_code); } sub ならば (&@) { _ならば(@_); } sub なら (&@) { _ならば(@_); } sub _ならば { my $sub = shift; my $obj = shift; my $self = { code => $sub, elsif => $obj, }; return bless $self,'Acme::Japarl::_COND'; } sub あるいは (&@) { _あるいは(@_); } sub それとも (&@){ _あるいは(@_); } sub _あるいは { my $sub = shift; my $obj = shift; my $self = { cond => $sub, elsif => $obj, }; return bless $self,'Acme::Japarl::_COND'; } sub しからずんば (&@) { _しからずんば(@_); } sub しからば (&@){ _しからずんば(@_); } sub そうでなければ (&@){ _しからずんば(@_); } sub _しからずんば (&@) { my $sub = shift; my $self = { code => $sub, }; return bless $self,'Acme::Japarl::_ELSE'; } package Acme::Japarl::_COND; sub elsif { $_[0]->{elsif}; } sub has_cond { $_[0]->{elsif}->{cond}; } sub has_code { $_[0]->{elsif}->{code}; } sub cond { $_[0]->{cond}->() if($_[0]->{cond}); } sub code { $_[0]->{elsif}->{code}->(); } sub ifcode { $_[0]->{code}->(); } package Acme::Japarl::_ELSE; use base qw(Acme::Japarl::_COND); 1; __END__ =pod =head1 NAME Acme::Japarl - The collaboration of Perl and Japanese =head1 SYNOPSIS use Acme::Japarl 'euc-jp' => 'shiftjis'; my $ほげ = "これはテストです"; my @配列 = 0..8; my @ふー; 出力 $ほげ, 改行; 出力 結合('', 逆転( 分割('',$ほげ) ) ), 改行; # すでトステはれこ 反復 { $_++ } @配列; # <=> for(@array){ code } @ふー = 倶列附 { $_ % 2 } @配列; # <=> grep { condition } @array 出力 @ふー,改行; @ふー = 地図 { $_, $_ * 2 } @ふー; # <=> map { code } @array 出力 結合(' ',@ふー),改行; my $条件 = 1; もし {$条件 == 0} ならば { 出力 "ok\n" } あるいは {$条件 == 2} ならば { 出力 "elsif1\n" } あるいは {$条件 == 3} ならば { 出力 "elsif2\n" } しからずんば { 出力 "else\n" }; 出力 木魚(); sub 木魚 { 帰還 'ぽくぽく'; } =head1 DESCRIPTION Perl5.8以降、Perlはより日本語と親和的になりました! もはや C などと書かなくともよいのです(たぶん)。 このモジュールをコードの先頭で導入しましょう。 すると変数やサブルーチンに日本語が使えるようになります。 ええ? これだけなら、自分でCと書けばよいだけですね。 ところがこのモジュールは、非常に実用的ないくつかの関数と、 制御構造を実現する関数とを導入してくれるのです。 今や、日本語に慣れ親しんだ人が、より馴染み深いコードを書けるようになります! 出力 結合('',逆転(分割('',$変数))); ほーら、わかりやすいでしょ? =head1 SUBROUTINES 次の関数がインポートされます。 =over 4 =item 出力 print =item 帰還 return =item 脱出 exit =item 逆転 reverse =item 分割 split =item 結合 join =item 倶列附 grep =item 地図 map =back =head1 CONTROL STRUCTRE 次の疑似制御構造が利用できます。 =over 4 =item 反復 反復 { ..code.. } @array; # <=> for(@array){ code } =item もし ... なら もし { condition } なら { code }; # <=> if( condition ){ code } もし { condition } なら { code1 } しからずんば { code2 }; # if( condition ){ code1 } # else{ code2 } もし { cond1 } ならば { code1 } あるいは { cond2 } ならば { code2 } しからずんば { code3 }; # if ( cond1 ){ code1 } # elsif( cond2 ){ code2 } # else { code3 } 「なら」は「ならば」でも可。 「あるいは」は「それとも」「そうでなければ」でも可。 「しからずんば」は「しからば」でも可。 最後の";"を忘れずに! =back =head1 CONSTANT 次の定数を導入します。 =over 4 =item 改行 \n =back =head1 CAUTION Cと違い、C<分割>は、第一引数に文字列をとります。 =head1 AUTHOR makamaka[at]donzoko.net (http://www.donzoko.net/) =head1 LICENSE same as Perl's one =head1 SEE ALSO Filter::Simple, utf8, encoding =cut