splitでデリミタも配列に含める

括弧を使う

日本語 perl texinfo - split

PATTERN が括弧を含んでいる場合、 delimiter 中でマッチする文字列からさらに配列要素が作り出される。

クールポコ

  • 仙庭 - 「モテようとしてTaverna使っている男がいたんですよ~」
  • 小野 - 「な~にぃ~?やっちまったな!!」
  • 仙庭 - 「男は黙って」
  • 小野 - 「シェルスクリプト!」
  • 仙庭 - 「男は黙って」
  • 小野 - 「シェルスクリプト!」
  • 仙庭 - 「何時の時代だよ~」
  • 小野 - 「次!」

HOP 7章終了

今週は仕事がやたらと忙しかったり、送別だ歓迎だと飲みが重なったので思うように読みすすめられなかったが、7章はページ数が少ないのでなんとか読み終えた。

perlで高階関数をどうやるかって章。 

クロージャを使ってカリー化するんだがそれだと関数っぽく呼べないのでglobを使う。というようなテクニカルな部分に関して解説。プロトタイプ宣言の部分とか良くわからなかったが、中盤以降あまり興味が持てなかったのでちゃんと読んでないような。

ちなみに、perlでカリー化するモジュールはSub::Curryってのがあります。

http://www.kzfmix.com/blosxom_archive/Computer/Linux/fpython060914.html

ファイナルファンタジー タクティクス A2 封穴のグリモア

FFTは買う

ProductName ファイナルファンタジー タクティクス A2 封穴のグリモア

スクウェア・エニックス / ¥ 5,040 ()
近日発売 予約可

とかいってFFTAは最後のあたりでとまっているが、、、、

久しぶりにやってみようか。

型グロブをいまいちちゃんと理解してないっぽい

型グロブで悩むの巻

*a = sub {1+2}

が$a->()でなくて

a() # 3

なのがいまいちわからない。

$ perlsh
main[82]$ $a = 5
5
main[83]$ $b = \$a
SCALAR(0x984e018)
main[84]$ *a
*main::a
main[85]$ *a{SCALAR}
SCALAR(0x984e018)
main[86]$ ${*a{SCALAR}}
5
main[87]$ $$b
5

ということは $b = \$a = *a{SCALAR}だからリファレンスベースで考えていけばいいのかな、、、、

$ $a = [1,2,3,4]
ARRAY(0x984e048)
main[89]$ @$a
1
2
3
4
main[90]$ *b = $a
*main::b
main[91]$ @b
1
2
3
4

とこんな感じ。

実用Perlプログラミングにグロブはハッシュを使って実装されてると書いてある。

ProductName 実用Perlプログラミング
サイモン カズンズ
オライリージャパン / ¥ 3,360 (2006-03)
通常24時間以内に発送

main[92]$ $a = [1,2,3]
ARRAY(0x9989060)
main[93]$ $b = {a => 3}
HASH(0x99890c0)
main[94]$ *c = $a
*main::c
main[95]$ *c = $b
*main::c
main[96]$ @c
1
2
3
main[97]$ %c
a
3

なんかrefの型にマッチさせてハッシュっぽくしてる感じだ。

でもまだちゃんと掴みきってないナァ。あと第2版は1章に小難しい話題を入れてる割にはページが少ないのでちょっとアレ。実用Perlプログラミング的には一章100pぐらいあって充実されてるほうが嬉しい。

大山でえびつけ麺

富士にいったついでに中里の大山に寄った

大山

えびシリーズは食べたことがなかったのでえびつけ麺。

えびつけ麺

桜海老の香りがスゴイことになってますな、コレ。むしゃむしゃ食ったらすぐなくなった。スープ割のスープも熱々。

満足。

HOP 6章終了

Higher-Order Perl 6章は無限ストリーム。SICPの3章あたりに対応してるので、SICPのcar,cdr,consで無限ストリームを扱うあたりを読んでいれば最初のほうはサクサク読めた。特にストリームの混ぜ合わせとかが面白い。

6.5がストリームを使ってREGEXから文字列を生成するという節。ここが結構わかりにくくて数ページずつくらいしか読み進められなかった。*(0回以上の繰り返し)の表現とか最初なかなか理解できなかったので、紙に書き下したりとかした。

6.6のNewton-Raphson MethodoもSICPで既に読んでたので、比較しながら読むと楽しい。ついでにループ判定の方法を使って数値の振動を発見する方法にふれてて面白かった。Gaucheクックブックの循環リストを扱うのアルゴリズム。

エラトステネスの篩のストリーム

HOPの6章は無限ストリームを扱っているのだけれど、SICPの無限ストリームの章にあるエラトステネスの篩が出てこないので書いてみた。

HOPだとcar,cdr,consがそれぞれhead,tail,nodeとなってるのでそれにあわせてある。promiseは計算を遅延させるためのクロージャ。

use strict;
use warnings;
no warnings 'recursion';

sub promise (&) { $_[0] }

sub node{
  my ($h, $t) = @_;
  [$h, $t];
}

sub head {
  my ($ls) = @_;
  $ls->[0];
}

sub tail {
  my ($ls) = @_;
  if(is_promise($ls->[1])){
    $ls->[1] = $ls->[1]->();
  }
  $ls->[1];
}

sub is_promise {
  UNIVERSAL::isa($_[0],'CODE');
}

sub drop {
  my $h = head($_[0]);
  $_[0] = tail($_[0]);
  return $h;
}

sub filter (&$) {
  my $f = shift;
  my $s = shift;
  until(! $s || $f->(head($s))){
    drop($s);
  }
  return if ! $s;
  node(head($s),promise {filter($f, tail($s))});
}

sub sieve {
  my $s = shift;
  node(head($s),
       promise {sieve(filter {$_[0] % head($s)} tail($s))});
}

sub upfrom {
  my ($m) = @_;
  node($m, promise{ upfrom($m+1)});
}

sub show {
  my ($s,$n) = @_;
  while($s && (! defined $n || $n-- > 0)){
    print head($s), $";
    $s = tail($s);
  }
  print $/;
}

my $primes = sieve(upfrom(2));
show($primes,300);

これで、素数のストリームが生成される。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン,ジュリー サスマン,ハロルド エイブルソン
ピアソンエデュケーション / ¥ 4,830 (2000-02)
通常24時間以内に発送

ProductName Higher-order Perl: A Guide To Program Transformation
Mark Jason Dominus
Morgan Kaufmann Pub / ¥ 7,608 (2005-05-30)
通常24時間以内に発送

無限ストリームは楽しい

スキルの"見えない階段"

見えない階段って上ったことのあるヒトにしか見えないよなぁと。

perlの grep $_, @_;

HOP6.5でなんだコレは?と。($_,@_)なんてありなのかと思ったがどうも違った。

sub test {
  my ($h, @s) = grep $_, @_;
  print "h:\t$h\n";
  print "s:\t";
  print join ",",@s,"\n";
}

test(3,undef,1,4,5);

実行結果

h:      3
s:      1,4,5,

配列の中からundefを除く、($_,@_)っていう配列ではなくて grep {$_} @_みたいな感じのgrep tipsだった。