use strict; use warnings; use utf8; use lib 'lib'; use Plusen; my $p = Plusen->bootstrap({ config => { meta => { title => "Let's enjoy Perl on the %^H", author => 'Kazuhiro Osawa - ( Yappo )', email => 'yappo shibuya pl', }, plugins => [ { module => 'ScriptLoader::Simple' }, # { module => 'Device::MozRepl', }, { module => 'Device::Term', }, # { module => 'Device::Growl', }, { module => 'Device::ControlFromFile', config => { path => '/tmp/devsumi-ctl.txt' } }, ], }, }); __DATA__ === title: who are yappo list: - at the Infomarks Corp. - YAPC::Asia 2008 のすぽんさ - 'PAUSE ID: YAPPO' - CodeRepos maintainer === title: and === title: 征夷大将軍 img: seiitaishougun.jpg === title: ここまで昨日のコピペ === title: "Today's talks" === title: not === title: mooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooose === title: se === title: そして今日はとても真面目な話です === title: Termに切り替える === title: 今日は%^Hの話をします === title: encoding::warnings === title: 言及しないお === title: 時には無茶ぶりをスルーする事も必要です === title: %^H ってなに? list: - hinthash と呼ばれてる - hintbits の親戚 - hintbits って $^H の事ね - 5.10 で出来たわけでは無い - 例えば autobox でもちょっと使ってる === title: 5.8 での使い方を見てみましょう === title: normal.pm code: | package normal; use strict; use warnings; sub import { $^H{$_[0]} = ($_[1] || 'default') } sub unimport { delete $^H{(shift)} } 1; === title: run-normal.pl code: | use strict; use warnings; use Data::Dumper; print "---- running\n"; use normal; no normal; use normal 'larry'; if (1) { use normal 'ingy'; } === title: run === title: レキシカルコープとか関係ないんだよね。。。 === title: レキシカルにしたい! list: - それ hintbits でできるよ - HINT_LOCALIZE_HH - hint localize hint hash === title: with_hintbits code: | package with_hintbits; use strict; use warnings; my $hint_bits = 0x20000; # HINT_LOCALIZE_HH sub import { $^H |= $hint_bits; $^H{$_[0]} = ($_[1] || 'default') } sub unimport { $^H &= ~ $hint_bits; delete $^H{(shift)} } 1; === title: run-with_hintbits.pl code: | use strict; use warnings; use Data::Dumper; print "---- running\n"; use with_hintbits; no with_hintbits; use with_hintbits 'larry'; if (1) { use with_hintbits 'ingy'; } === title: run === title: この方法って list: - BEGIN フェーズでしか - %^H がまともにつかえないから - 活用するのがむづかしい === title: autoboxは上手くやってる === title: autobox list: - Scope::Guard を hinthash に入れる - HINT_LOCALIZE_HH も組み合わせてる - autobox は定義をレキシカルスコープ - 的に宣言して自然に使える - %^Hのお陰 - 詳しくはソース読んでね === title: 5.10でどうなったのか === title: perldeltaによると(hio++) code: | The implementation of the special variables $^H and %^H has changed, to allow implementing lexical pragmas in pure Perl.特殊変数 $^H 及び %^H の実装が, pure Perl でレキシカルプラグマを実装できるように変更されました. === title: on eval code: | The compile-time value of the %^H hint variable can now propagate into eval("")uated code. This makes it more useful to implement lexical pragmas.%^H ヒント変数のコンパイル時の値は eval("") されたコードにも伝播するようになりました. これはレキシカルプラグマを実装するのにより一層役立ちます. === title: B code: | (Joshua ben Jore) Its now possible to access the lexical pragma hints (%^H) by using the method B::COP::hints_hash(). It returns a B::RHE object, which in turn can be used to get a hash reference via the method B::RHE::HASH(). (Joshua ben Jore)レキシカルプラグマヒント(%^H)に B::COP::hints_hash() メソッドを使うことでアクセスできるようになりました. これは B::RHE オブジェクトを返し, さらに B::RHE::HASH() メソッドを通してhハッシュリファレンスを取得するために使うことができます. === title: よくわかんねw === title: かいつまむと list: - レキシカルになったよ! - (caller(0))[10] とかで - hinthashとれるよ! - strictみたいなpragmaを誰でも書けるよ! - レキシカルプラグマ書き放題! === title: さっきのコードに5.10パワーを加えたら。。。 === title: normal.pm(改) code: | package normal; use strict; use warnings; sub import { $^H{$_[0]} = ($_[1] || 'default') } sub unimport { delete $^H{(shift)} } sub hinthash { (caller(0))[10] } 1; === title: run-normal-perl510.pl code: | use Moose;use Data::Dumper; print "---- running\n"; use normal; warn "caller: " . Dumper(normal->hinthash); no normal; warn "caller: " . Dumper(normal->hinthash); use normal 'larry'; warn "caller: " . Dumper(normal->hinthash); if (1) { use normal 'ingy'; warn "caller: " . Dumper(normal->hinthash); } === title: run === title: そろそろ佳境 === title: ブラウザに切り替える === title: abstractに code: | hinthashと聞いてピンと来た人はもちろん、ピンとこなかった人もPerl5.10の強力なhinthash拡張を見れば世界が変わります。そうです、好き勝手にpragmaが作れちゃうのです。実践的なhinthashからド変態なhinthashまで全て見せます。 === title: と書いちゃったんですが === title: 実践的なほう思いつかなかったので変態で攻めます === title: %^H の H は Hentai の H だったのだ === title: AA省略(MMR復活おめでとう === title: 5.10的な意味での変態的なhinthashの使い方をした教科書的なCPANモジュールがあるので紹介します === title: use dan; img: dankogai.jpg === title: これ以降のページはdanさんのプレゼン見ながら書いた === title: dan.pm list: - 空気(文字リテラル)を読まなくなる - もしくは - 文字リテラルを置換する - perl 5.10 から使ってね === title: danさんのプレゼンでPerlは空気を読むと連呼してたけど、dan.pmは読まなくなりますから! === title: example code: | use strict; use warnings; use dan; print "トラックバック予定地\n"; no dan; print "助けてダンコーガイ\n"; === title: example2 code: | use strict; use warnings; use dan cat_decode => sub { my $str = shift; $str =~ s/jcode.pl/Encode.pm/; $str; }; print "jcode.pl\n"; === title: Run === title: つたえたいことは === title: dankogaiを大切にね! === title: thank you.