Perl
何が起こったかと思った。 $ perl -e 'print 4x{d}' こんなのもできる。 $ perl -e 'print []x[]'
「独自のプロパティを作ってそれを利用した正規表現」による置換と、「既存のブロックを使った正規表現」による置換とを比べてみる。実際には、「独自のプロパティを作る」のに必要なコンパイル時間や、それぞれの正規表現をコンパイルする時間も比較しなけ…
記号っぽいものを特定して置換しなければならない。おそらく、Perl で定義されているユニコードプロパティとは一致しない。そこで独自にプロパティを作ってみることにした。ついでに、ヒアドキュメントを見やすく、かつコメントもつけられるように試みた。ユ…
WEB から取ってきた文字列を標準化するコードを書いている。前回エントリを書いたところ、コメントで Regexp::Assemble (R::A) を教えてもらった。R::A オブジェクトに複数の正規表現を入れておいて、文字列をマッチさせ、どれがマッチしたか、を知ることが…
文字列 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 で解析したとき、ネストが 4 桁になるような HTML がある。実際に HTML としてネストが深いか、というと、そうである場合とそうでない場合がある。実際にネストが深い場合というのは、本当に center タグが延々と掘られていたり、font タ…
Regexp::Assembleのバグ? - Humanity によると、 ということで正規表現リテラル(?)じゃなく文字列で渡せばうまくいきました。 ということだったけれど、いろいろやってみたらそういうわけでもなさそう、つまり、文字列を渡しても落ちるときは落ちるみたい、…
if, elsif, elsif, ... なコードをどう書き直せばわかりやすいか悩んでいたら、トラックバック & コメントで Regexp::Assemble を教えてもらって、サンプルコードまで教えてもらった。 Regexp::Assembleのバグ? - Humanity で、話は Regexp::Assemble の ad…
WEB から持ってきた文字列を標準化するコードを書いている。いろいろなスタイルで書かれた文字列を「使えるかたち」に揃えるコード、とも言える。きれいに書くのが難しい。ある正規表現にマッチするかどうか調べ、マッチしたらそこから情報を切り出し、マッ…
簡体字やハングルにマッチしない正規表現ってどう書くんだろう。 $ echo -n e38392 e69db1 e4b89c 0a | xxd -p -r | perl -MEncode -pe '$_=decode_utf8($_);s/(\p{Han})/<$1>/g;$_=encode_utf8($_)' ヒ<東><东> 簡体字も Han script に含まれるよなあ…
昨日、ある coro A の on_destroy コールバックを実行する coro B が、A がみずから終了した場合 (B は coro manager) と外から cancel した場合 (B はメイン coro) で違うことを発見した。外から cancel した場合は、メイン coro から cancel したから B が…
昨日 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 なインライン要素タグを正規表現を使って除去するスクリプトを書いた。 HTML から span like なインライン要素タグを正規表現を使って除く修行、その2 - 昨日知ったこと HTML から span like なインライン要素タグを正規表現を使…
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::timer の callback coro AnyEvent::timer のコールバックが実行されるのはイベントループだからメイン coro なんだろうと思っていた。が、次のプログラムを走らせてみて、そうではないことを知った。 use strict; use warnings; use Coro; use Any…
coro プールを使った場合、coro は async_pool ブロックを抜けても terminate はしない。すると、join もできないことになる。 $ perl -MCoro -e '(async{})->join' $ perl -MCoro -e '(async_pool{})->join' FATAL: deadlock detected. 明示的に coro の中…
Coroでスレッドプールを使う - 北海道苫小牧市出身の初老PGが書くブログで Coro でスレッドプールを使う際の注意点が、様々なベンチマークと共に示されている。まとめとして 「async_poolを使う時には、同時にたくさんのスレッドを利用し過ぎないように気を…
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 での並行ダウンローダの習作 - 昨日知ったことの続き。前回のスクリプトでは、処理が進むにつれセマフォの数が増えていってしまうことが問題だった。セマフォのカウンタが元に戻ったら、そのセマフォを delete できれば一定数以上セマフォが…
AnyEvent と Coro を使って、WEB から非同期に並行ダウンロードするプログラムの習作を作ってみた。http://kaede.to/~canada/doc/wiser-clawer-sample-using-coroをだいぶ参考にさせてもらっている。紹介されている非同期クローラはとてもいいのだが、自分が…
次のプログラムでは、$w2 のスコープはブロックの中だけなので、ブロックを抜けたときに undef され、timer watcher $w2 はキャンセルされる。 use strict; use warnings; use AnyEvent; my $cv = AnyEvent->condvar; my $w3 = AnyEvent->timer( after => 3,…
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::Intro を読んで Coro::Channel について知ったので、これを使ったプログラムを書いてみることにした。ネタとしていいものが思い浮かばなかったので、回文素数 (回文数である素数) を生成するジェネレータを無駄に作ってみた。
大量の URL からファイルを持ってきて解析するプログラムを作っている。プロセスを並行して走らせ、それぞれが LWP を使ってファイルをダウンロードしている。で、これは Coro + AnyEvent を使うと速くなるよ、という噂を聞いたので Coro + AnyEvent を勉強…
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 でインストールしたもののリストを表示するワンライナー。 $ perl -MExtUtils::Installed -e '$i=ExtUtils::Installed->new;print "$_ ".$i->version($_)."\n" for $i->modules;' 参考 年越しそばと初詣は絶対に欠かせない: CPANでインストールしたモジ…
$ perl -e 'print "[$_]\n" foreach qw/ a b c /;' [a] [b] [c] であって、 $ perl -e 'print "[$_]\n" foreach qw/ a b c /;' [] [a] [b] [c] [] ではない。ま、当たり前か。
あるモジュールが標準モジュールか、いつからか、どのバージョンなのかを調べるには 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/) の下に移動したい。ただし、元ディレクトリ以下のディレク…