perl

split はデフォルトで後続する空フィールドを削除する

昔々はまったことあるけど,久々に Perl 使ったらはまったので記念*1に。 sub show { print join q{, }, @_; print "\n"; } # デフォルトでは後続する空フィールドは削除される show split(/:/, 'a:b:c:::'); ### => a, b, c # 第3引数を正数で指定すると,…

DBIC のスキーマをモデルクラスとして使ってみる

ドキュメントに書いてないので今後も使えるかわかんないけど、メモメモΦ 普通 DBIC で新しいレコードを挿入するには、 use strict; use warnings; package My::Schema::Artist; use base qw( DBIx::Class ); __PACKAGE__->load_components(qw( Core )); __PA…

DBIC で後付けの relationship を定義してたらうまく動かなくなった

昔かいた DBIC を使うコードが,DBIC を新しくしたら動かなくなった。 うまくいく例 use strict; use warnings; # artist の定義 package My::Schema::Result::Artist; use base qw( DBIx::Class ); __PACKAGE__->load_components(qw( Core )); __PACKAGE__-…

Microsoft Word 文書からテキストを抽出するモジュールを書いた

CPAN にはなさそげだったので書いてみました。 http://svn.coderepos.org/share/lang/perl/MSWord-ExtractContent/trunk/ 名前空間がどうよって気がするけど Word 文書に該当する名前空間が見当たらず,こんな感じにしてしまいました。まぁ coderepos の段階…

base (< 2.14) が $SIG{__DIE__} を破壊するのではまった

たとえば, #!/usr/bin/perl use strict; use warnings; local $SIG{__DIE__} = sub { warn "signal handled"; die $_[0]; }; require Foo; die "foo"; こんなスクリプトがあったとして,実行すると, signal handled at test.pl line 7. foo at test.pl lin…

PerlIO の encoding layer の fallback ではまった

PerlIO の encoding layer は,$PerlIO::encoding::fallback という変数に fallback type を指定しておくことができるみたい。ということを PerlIO::encoding - encoding layer - metacpan.org 見て知った。encoding いじるのに PerlIO 使うのはなんとなく敬…

SQL::Abstract で LIKE の ESCAPE を指定する

正規表現でいう ^a_c.* みたいなのをひっかけようと思って, my ($sql, @binds) = SQL::Abstract->new()->select( # table 'foo', # fields [ '*' ], # where { id => { LIKE => 'a_c%' }, }, ); みたくやると,a_code だけでなく abc もマッチしてしまう罠…

そのごの UUID::Object

だらだらと書く。 仕様をフルに満たしている UUID の CPAN モジュールがほとんどない Pure Perl で書かれたまともな UUID モジュールが CPAN にない そのくせ UUID の既存の実装が CPAN にいっぱいあって混乱ぎみ (ここまでは UUID と Perl について - dail…

Exporter を使ったモジュールの継承

おまえは何を言っているんだみたいな話だったらすみません。 たとえば,foo() という関数を export している ModA というモジュールがあるとします。 package ModA; use strict; use warnings; use base qw( Exporter ); our @EXPORT = qw( foo ); sub foo {…

コールトレースを追うデバッグ用モジュール

Perl スクリプトをトレースするには Perl デバッガを使ってもいいですが,全体的な実行フローを追いたい場合 Devel::Trace が使えます。たとえば #!/usr/bin/perl use strict; use warnings; my $i = 0; sub foo { bar(); baz(); } sub bar { baz(); } sub b…

UUID::Object と UUID::Generator::PurePerl を書いた

UUID と Perl について - daily dayflower でうだうだ書いてたのですが,Pure Perl 実装の UUID generator が欲しくなったので書いてみました(各種 UUID モジュールのインタフェースを共通化するモジュールはまだ書いていません)。CodeRepos に置いてあり…

UUID と Perl について

UUID がどういうものであるか,とか UUID の表現形については省略します。 UUID - Wikipedia が参考になるかと。UUID の仕様として RFC 4122 を参照しました*1。なのでより細かいことについては原文を参照してください。策定されるまでにいろいろ経緯がある…

use utf8 環境下で => オペレータの左辺が UTF8 flag on になってしまう

use strict; use warnings; sub Dump { @_ = map { sprintf "'%s'(%s)", $_, utf8::is_utf8($_) ? 'utf8' : 'bytes' } @_; print {*STDERR} join(q{, }, @_), "\n"; } no utf8; Dump( foo => 'bar' ); #=> 'foo'(bytes), 'bar'(bytes) no utf8; だもんで,両…

prove (Test::Harness) コマンドの --state オプション

テストが膨大になっていくと,あるテストでは時間がかかったりして「そのテストはもう成功することがわかっとるっちゅうねん;失敗するテストだけ再テストしたいっちゅうねん」ってことになったりします。そんなときに使えるのが prove コマンドの --state …

RHEL 5(.2) の perl-5.8.8-15.el5_2.1 で例のバグが治っていた

例のバグとは,あの overload rebless のバグを解消するために bless にパフォーマンスペナルティが発生していたやつです。 overload の rebless バグについて - daily dayflower CentOS 5.1 の perl をリビルドする - daily dayflower ずいぶん前*1ですが,…

複数ファイルを使った中規模 XS の開発

複数ファイルをビルド対象とした XS の開発について,あまり手間をかけないシンプルで効果的な方法を書いていきます。自分の経験をもとに書きますのでベストプラクティスではありませんが。 余談(SV*() マクロの sideeffect にやられた話) state_stack と…

CPAN 最速検索の劣化コピー作ってみた

mala さんの CPAN 最速検索を便利に使わせてもらってるんですが,操作上ちょっと不満なところがいくつかありまして。 カーソルキーのオートリピートがきかない ホイールがきかない 候補の同時表示数が固定 Firefox だからかもしれないですけど。んで改造しよ…

Perl XS メモ - typemap と MAGIC をからめて

id:tokuhirom さんが http://d.hatena.ne.jp/tokuhirom/20081209/1228829454 で下地をつくってくださったので(perl-users.jp むけまとめも期待してます),ちょっとアドバンスドな話題を。 例題 http://www.sra.co.jp/people/m-kasahr/eb/ http://www.sra.c…

Firefox の places.sqlite からブックマークをとりだす

新規インストールしたマシンに旧マシンの Firefox のブックマークを移行しようと思いました。で,どうせ bookmarks.html でしょと思ってみてみたら,どうも内容が乏しい。調べてみたら Firefox 3 では places.sqlite というファイルにブックマークはじめアク…

__PACKAGE__ 頻出のコードがうざいとき

いちいち__PACKAGE__と書かなければならないのは面倒くさい! DBIx::Classのシンタクスシュガーがほしい - Islands in the byte stream はてブコメントの斜め上っぷりに激しくわらわせていただきました。たしかにこんだけいっぱいでてくるとうっとおしいです…

こんなテンプレートエンジンほしい

なぜ、いちいちエスケープを手動で指定しなければいけないのか 文脈によって、自動的にエスケープ手法は決定できるはず と思ってます。 テンプレートエンジン作りたい - kazuhoのメモ置き場 ですよねー。で,そのへんを自然に取り込んでいるのが,おもに Pyt…

日本語 POD が perldoc で読めない

マルチバイトでかかれた(たとえば =encoding utf-8 な日本語)POD を perldoc で表示すると, XXXXXみたいになってしまいます(CentOS なり Ubuntu なりで)。 とりあえず読みたい,というのなら, % perldoc -t Hoge::Nihongoみたいに nroff コンバータで…

libxml2 の XmlTextReader インタフェースで XML をパースする

libxml2 のドキュメントを眺めていたら,DOM インタフェースや SAX インタフェースだけではなく,XmlTextReader インタフェースというのもありました。これはドキュメントをパースしながら(ストリーミング)処理をしていくという点で SAX インタフェースに…

XML::LibXML の SAX インタフェースで XML をパースする

libxml2 を C でいじっていたんですけど,あれこれ書いていくのが面倒になったので,とりあえず Perl でプロトタイプを書くことにしました。つうことで,Perl から XML::LibXML を使ってみました。前回と同じく SAX インタフェースです。普通の用途では使わ…

v8 (Google JavaScript Engine) を Perl XS モジュールにしてみた

やはりやっつけで。Joke module です。いろいろ書きたいことがあるけど,そのうち(追記するかも)。libv8 と XS の間をとりもつ bridge.cc。 /* bridge.cc */ #include <v8.h> #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" /* h</v8.h>…

シェル機能をインプリメントしたいなら Term::ShellUI を使うと便利

Web::Scraperのshellをhistoryから補完できるようにしてみました。shell系は使わないと忘れてしまうので、historyがあったほうがいいかなと思って作ってみました。~/.scraperhistoryを作っておくと、historyが使えるようになります。 Web::Scraperのshellでh…

Scalar::Util の weaken()

Shibuya.pm #9 での id:lestrrat さんの発表 での質疑応答において id:dankogai 氏 weak references の実装はどのようになっていますか? id:lestrrat 氏 あー準備してくるの忘れました。Scalar::Util の Util.xs を見てください :) というやりとりがありま…

PL_check とパトリオットミサイルのしくみ

前回の記事はおかげさまで id:yappo さんに HE-N-TA-I 認定されたので安心してたら,マッチョな人に牛刀フラグを立てられ(もちろん冗談です*1),Shibuya.pm 入会への道もなかなか険しいなぁと思い知りました。そんな空気は読まずに理論編?を Perl 5.8.8 …

PL_check hack の旧スタブ

すいません。間違えて新しい記事にしちゃいました。ブクマしてくださった方々申し訳ないです。新記事 → PL_check hack - daily dayflower

PL_check hack

(あとでかく) XS くらいいじれないと Shibuya.pm に加入できないらしいので,とりあえず書きましたー。今回は実践編なので,あまりわかりやすい内容&たいした内容ではないです。わっふるさせてごめんなさい。 ゴール #!/usr/bin/perl eval 'print "Hello …