Perl

4x{d}

何が起こったかと思った。 $ perl -e 'print 4x{d}' こんなのもできる。 $ perl -e 'print []x[]'

独自のプロパティを使った正規表現置換のベンチマーク

「独自のプロパティを作ってそれを利用した正規表現」による置換と、「既存のブロックを使った正規表現」による置換とを比べてみる。実際には、「独自のプロパティを作る」のに必要なコンパイル時間や、それぞれの正規表現をコンパイルする時間も比較しなけ…

独自のプロパティを作って正規表現置換してみる修行、ついでにコメントつきヒアドキュメントの試み

記号っぽいものを特定して置換しなければならない。おそらく、Perl で定義されているユニコードプロパティとは一致しない。そこで独自にプロパティを作ってみることにした。ついでに、ヒアドキュメントを見やすく、かつコメントもつけられるように試みた。ユ…

if, elsif, elsif, ... なコードをどう書き直せばわかりやすいか悩む修行、その2

WEB から取ってきた文字列を標準化するコードを書いている。前回エントリを書いたところ、コメントで Regexp::Assemble (R::A) を教えてもらった。R::A オブジェクトに複数の正規表現を入れておいて、文字列をマッチさせ、どれがマッチしたか、を知ることが…

456 にマッチする正規表現を見つけろ

文字列 456 にマッチする正規表現のうち、Regexp::Assemble を使ってどれがいちばん早くマッチするか。 use strict; use warnings; use Regexp::Assemble; my $ra = Regexp::Assemble->new->track; #$ra->debug(0xf); $ra->add(map {"($_)"} qw{456 \d{3} .*…

HTML::TreeBuilder でネストが深い HTML を調べる修行

HTML::TreeBuilder で解析したとき、ネストが 4 桁になるような HTML がある。実際に HTML としてネストが深いか、というと、そうである場合とそうでない場合がある。実際にネストが深い場合というのは、本当に center タグが延々と掘られていたり、font タ…

Regexp::Assemble のバグなのか、どうかいろいろ試す修行

Regexp::Assembleのバグ? - Humanity によると、 ということで正規表現リテラル(?)じゃなく文字列で渡せばうまくいきました。 ということだったけれど、いろいろやってみたらそういうわけでもなさそう、つまり、文字列を渡しても落ちるときは落ちるみたい、…

正規表現リテラルをハッシュキーにしたときの動きを探る修行

if, elsif, elsif, ... なコードをどう書き直せばわかりやすいか悩んでいたら、トラックバック & コメントで Regexp::Assemble を教えてもらって、サンプルコードまで教えてもらった。 Regexp::Assembleのバグ? - Humanity で、話は Regexp::Assemble の ad…

if, elsif, elsif, ... なコードをどう書き直せばわかりやすいか悩む修行

WEB から持ってきた文字列を標準化するコードを書いている。いろいろなスタイルで書かれた文字列を「使えるかたち」に揃えるコード、とも言える。きれいに書くのが難しい。ある正規表現にマッチするかどうか調べ、マッチしたらそこから情報を切り出し、マッ…

日本語にマッチする正規表現って

簡体字やハングルにマッチしない正規表現ってどう書くんだろう。 $ echo -n e38392 e69db1 e4b89c 0a | xxd -p -r | perl -MEncode -pe '$_=decode_utf8($_);s/(\p{Han})/<$1>/g;$_=encode_utf8($_)' ヒ<東><&#19996;> 簡体字も Han script に含まれるよなあ…

coro を cancel したときの on_destroy コールバックは cancel を実行した coro で実行される

昨日、ある coro A の on_destroy コールバックを実行する coro B が、A がみずから終了した場合 (B は coro manager) と外から cancel した場合 (B はメイン coro) で違うことを発見した。外から cancel した場合は、メイン coro から cancel したから B が…

coro manager を cancel してみる修行

昨日 coro manager を捕まえることに成功した。ので、これを cancel してみるとどうなるかやってみた。 use strict; use warnings; use Coro; sub ps { use Coro::Debug; Coro::Debug::command 'ps'; } sub get_mgr { my $mgr; async{ print "-pass-\n" }->o…

HTML から span like なインライン要素タグを正規表現を使って除く修行、その3

以前、HTML から span like なインライン要素タグを正規表現を使って除去するスクリプトを書いた。 HTML から span like なインライン要素タグを正規表現を使って除く修行、その2 - 昨日知ったこと HTML から span like なインライン要素タグを正規表現を使…

coro manager を捕まえる

ps したときに列挙される coro の中にある [coro manager] coro を捕まえた。main スレッドで作った coro の on_destroy コールバックで。 [takeyuki@sunya ~]$ perl -MCoro -e 'async{}->on_destroy(sub {print $Coro::current->desc."\n"});cede;' [coro m…

AnyEvent のコールバックの coro は main coro じゃないことを知り、coro の PID はアドレス値であることを知る修行

AnyEvent::timer の callback coro AnyEvent::timer のコールバックが実行されるのはイベントループだからメイン coro なんだろうと思っていた。が、次のプログラムを走らせてみて、そうではないことを知った。 use strict; use warnings; use Coro; use Any…

async_pool は terminate しないから join もできない

coro プールを使った場合、coro は async_pool ブロックを抜けても terminate はしない。すると、join もできないことになる。 $ perl -MCoro -e '(async{})->join' $ perl -MCoro -e '(async_pool{})->join' FATAL: deadlock detected. 明示的に coro の中…

coro プールに関するベンチマーク

Coroでスレッドプールを使う - 北海道苫小牧市出身の初老PGが書くブログで Coro でスレッドプールを使う際の注意点が、様々なベンチマークと共に示されている。まとめとして 「async_poolを使う時には、同時にたくさんのスレッドを利用し過ぎないように気を…

async_pool で coro が再利用されているのを確認する

use strict; use warnings; use Coro; for my $i (0..4) { print $i .q{,}. async_pool { print "$i-1\n"; cede; print "$i-2\n"; cede; print "$i-3\n"; }, "\n"; print "main\n"; cede; } [takeyuki@sunya ~]$ perl a.pl 0,Coro=HASH(0x94f4398) main 0-1 …

全角括弧の半角変換

[takeyuki@sunya pbird]$ echo $LANG ja_JP.UTF-8 [takeyuki@sunya ~]$ echo "()" | perl -pe 'tr{()}{()}' ())()) なんだこれは。全角「(」が半角「()」に変換されたように見える。 [takeyuki@sunya ~]$ echo "()" | perl -Mutf8 -pe 'tr{()}{()}'…

AnyEvent + Coro での並行ダウンローダの習作 その 2

AnyEvent + Coro での並行ダウンローダの習作 - 昨日知ったことの続き。前回のスクリプトでは、処理が進むにつれセマフォの数が増えていってしまうことが問題だった。セマフォのカウンタが元に戻ったら、そのセマフォを delete できれば一定数以上セマフォが…

AnyEvent + Coro での並行ダウンローダの習作

AnyEvent と Coro を使って、WEB から非同期に並行ダウンロードするプログラムの習作を作ってみた。http://kaede.to/~canada/doc/wiser-clawer-sample-using-coroをだいぶ参考にさせてもらっている。紹介されている非同期クローラはとてもいいのだが、自分が…

AnyEvent my $w; $w = ... と書くわけ

次のプログラムでは、$w2 のスコープはブロックの中だけなので、ブロックを抜けたときに undef され、timer watcher $w2 はキャンセルされる。 use strict; use warnings; use AnyEvent; my $cv = AnyEvent->condvar; my $w3 = AnyEvent->timer( after => 3,…

AnyEvent watcher のキャンセル実験

AnyEvent の watcher をキャンセルする実験。今から 2 秒後の発火を待つ timer watcher を、今から 1 秒後にキャンセルしてみる。 use strict; use warnings; use AnyEvent; my $cv = AnyEvent->condvar; my $w3 = AnyEvent->timer( after => 3, cb => sub {…

Coro::Channel を使った回文素数ジェネレータを作ってみる修行

Coro::Intro を読んで Coro::Channel について知ったので、これを使ったプログラムを書いてみることにした。ネタとしていいものが思い浮かばなかったので、回文素数 (回文数である素数) を生成するジェネレータを無駄に作ってみた。

Coro::State を使って双子の素数ジェネレータを作ってみる修行

大量の URL からファイルを持ってきて解析するプログラムを作っている。プロセスを並行して走らせ、それぞれが LWP を使ってファイルをダウンロードしている。で、これは Coro + AnyEvent を使うと速くなるよ、という噂を聞いたので Coro + AnyEvent を勉強…

if と elsif の条件節の中の変数のスコープ

use strict; use warnings; my $x = 2; my $y = 4; # (1) line 5 if ((my $y = 2) == $x) { # (2) line 6 my $y = 5; # (3) line 7 print "x=$x, y=$y\n"; } elsif ((my $y = 3) == $x) { # (4) line 10 print "x=$x, y=$y\n"; } else { print "x=$x, y=$y\n…

CPAN でインストールしたもののリストを表示するワンライナー

CPAN でインストールしたもののリストを表示するワンライナー。 $ perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new;print "$_ ".$i->version($_)."\n" for $i->modules;' 参考 年越しそばと初詣は絶対に欠かせない: CPANでインストールしたモジ…

qw の中身の先頭や末尾がホワイトスペースだった場合、先頭や末尾に空文字列が入っているとみなされるわけではない

$ perl -e 'print "[$_]\n" foreach qw/ a b c /;' [a] [b] [c] であって、 $ perl -e 'print "[$_]\n" foreach qw/ a b c /;' [] [a] [b] [c] [] ではない。ま、当たり前か。

Perl の標準モジュールかどうかを確認する方法

あるモジュールが標準モジュールか、いつからか、どのバージョンなのかを調べるには Module::CoreList で。 C:\Users\takeyuki>perl -MModule::CoreList -e "print Module::CoreList->first_release('Module::CoreList');" 5.009002 Module::CoreList 自体が…

ディレクトリ階層を保存してファイルを移動

あるディレクトリ (たとえば /tmp/a/b/c/) の下、いくつかディレクトリを掘った下にあるファイルがある (たとえば、/tmp/a/b/c/x/y/z.txt)。このファイルを別のディレクトリ (たとえば /tmp/a/d/e/) の下に移動したい。ただし、元ディレクトリ以下のディレク…