Perl
あるページの更新日を Google に聞きたい。 Web::Scraper の scraper スクリプトを使って試してみたのだが、いまひとつわからない。"mato.me" について検索してみたところ。 scraper> process 'div.s', 'results[]' => scraper { process 'span', 'date' => …
携帯から twitter にツイートしたい。とりあえずツイートできればよくて、TL が見えなくても構わない。メールを送ったらその内容をツイートしてくれればいい。メールを送るだけならパケットも少なくて済むし。そういうアプリはすでにあるだろうが、自分専用…
Path::Class::Dir の recurse メソッドを使っていて、なぜか走査されないディレクトリがある。具体的には、サブディレクトリとして 0/, 1/, 2/, ..., e/, f/ があるのだが、0/ と 1/ と f/ の下のファイルが走査されない。試しに children で一覧してみると…
最近、一時的に必要な変数のスコープを狭めるために do ブロックを使うことが多い。たとえば、次のようなスクリプトを考える。 my ($x, $y) = (3, 5); my $diff = $x - $y; my $first = $diff ** 2; my $second = abs($x ** 2 - $y ** 2); print "first = $f…
必須の引数とオプショナルな引数の順序に悩む修行 - 昨日知ったことにて、オプショナルな引数を必須の引数の前に書くメソッドの定義はどうだろう、ということを書いた。 my $stuff = new Stuff(code => q/353/, flag => 1, $string); そういう例はみたことが…
二つの対応した文字列がある。もっと正確に言うと、それぞれをある記号で split したときの、各要素が対応している。対応した文字列要素のペアを基にごにょごにょして新しい要素を作り、それをリストにしたい。と、ややこしく書いているが、要するに List::M…
モジュールのロードについて実験するため、A.pm と B.pm に test 関数を定義して、次のようなスクリプトを動かしてみた。 use strict; use warnings; use A; use B; B::test(); my $x = A::test(); 実行すると次のようになる。 [takeyuki@sunya ~]$ perl b.p…
正規表現で素数判定ができる、という噂はずいーーぶん昔に聞いた。やってみたことはないので、やってみた。 Perl で書いたけれど、他の言語でも同じようなものだろう。 use strict; use warnings; my $x = 2; my $c = 0; while ($c < 10) { if (('o' x $x) !…
Perl インタプリタに書けたらエラーが発生するスクリプトを書いてみた。エラー出力がスクリプトに等しい、エラー Quine。 syntax error at a.pl line 2, at EOF Execution of a.pl aborted due to compilation errors. 実行結果。 [takeyuki@sunya ~]$ perl …
標準出力だけでなく、標準エラー出力する Quine を書いてみた。やってみてわかったことは、たいして面白くないってこと。ヒアドキュメント + 正規表現置換技、とはまったく別の方法の Quine を考える方が面白いだろう。 use strict; use warnings; my $x = <…
あるクラス Stuff のコンストラクタには文字列を渡す。 my $stuff = new Stuff($string); で、オプショナルな引数は名前つきの引数で渡したい。そのとき、こういう風に書くのはどうだろうか。 my $stuff = new Stuff(code => q/353/, flag => 1, $string); #…
変数をループで回しながら、特定の条件にマッチしたところでループを抜け出し、条件にあった変数値を得たい、というときがある。そんなとき、次のようなコードを書いていた。 use strict; use warnings; my @candidates = qw/this is a test/; my $code; PRE…
配列の場合は $array[リスト] と添字を指定して新たなリストが作れる。 $ perl -e '@x=(0..5);@y=@x[2,1,4];print @y' 214 ハッシュの場合も $hash{リスト} とキーを指定して新たなハッシュを作るか、そのキーの値のリストができるかすると嬉しい。 [takeyuk…
国際化ドメインをエンコード、デコードしたい。CPAN シェルを使ってインストールできるモジュールはなさそう (Punycode の encode/decode はどのモジュールを使えばいいのか考える修行 - 昨日知ったこと) なので自分で Pure Perl なモジュールを書かないとか…
golferPerl の偉い人には常識なんだろうけれど。現在の入力ファイル行番号 $. は、for ではカウントされない。while だとカウントされる。 [takeyuki@sunya ^]$ cal | perl -e 'print$..$_ for<>' 8 2月 2010 8日 月 火 水 木 金 土 8 1 2 3 4 5 6 8 7 8 9 1…
ヒアドキュメントを使わずに Quine を書いてみた。予想どおりヒアドキュメントを使うよりもサイズが大きい。s///;print を使う技ではこれが限界なんだろうか。 $,=chr(39);$_='$,=chr(39);$_=u;s/u/$,$_$,/;print';s/u/$,$_$,/;print [takeyuki@sunya ~]$ pe…
my ($x, $y) = ... という形だけではなく、 (my $x, $y) = ... という形も書ける。というか、 (my $x, my $y) = ... を簡潔に書いたのが my ($x, $y) = ... なのか。 use strict; use warnings; my ($x, $y) = qw/abc def/; { (my $x, $y) = qw/123 456/; } …
use strict; use warnings; sub cut { my $s = shift; $s =~ s/^ //mg; $s; } my $s = cut <<'__EoD__'; use strict; use warnings; sub cut { my $s = shift; $s =~ s/^ //mg; $s; } my $s = cut <<'__EoD__'; x my $t = $s; $t =~ s/^/ /mg; $s =~ s/x/$t\…
tr では全角数字も範囲指定できるようだけど、正規表現ではダメみたい。 1[takeyuki@sunya pbird]$ perl -Mutf8 -e '$x=q/3/; $x =~ tr/0-9/0-9/; print $x,"\n"' 3 [takeyuki@sunya pbird]$ perl -Mutf8 -e '$x=q/3/; $x =~ s/0-9/x/; print $x,"\n"'…
Quine、すなわち、自分自身を出力するコード、昔から興味はあったが書いたことはなかった。 短くもないし、とりたてて特別なトリックがあるわけでもないけど、初めて作った作品なので掲載。 use strict; use warnings; my $s = <<'__EoD'; use strict; use w…
[takeyuki@sunya ~]$ perl -MData::Dumper -e 'my $x = bless bless bless bless bless bless bless bless bless bless bless {}; print Dumper($x)' $VAR1 = bless( {}, 'main' );
(a,b,c,d,e,f,g,h,i,j) という配列から、たとえば (e,f,g,h,i,j,a,b,c,d) という配列を作る。 use strict; use warnings; sub flip { my ($array_ref, $cut_index) = @_; return @{$array_ref} if $cut_index <= 0; my $max_index = $#{$array_ref}; return …
次のスクリプトは z をいくつ出力するか。 use strict; use warnings; #define sleep(times) print q/z/ x times sleep(100); print "z\n"; [takeyuki@sunya ~]$ perl -P a.pl zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz…
ユーザを待たせる長い処理を行う場合には、進行状況をユーザに知らせるプログレスインジケータを出すのが作法である。Perlベストプラクティス では、ユーティリティサブルーチンを使う方法 (10.16 節) と Smart::Comments を用いる方法 (10.17 節) を紹介し…
Perl で y という名前の関数を作ったら、&y で呼び出さないといけない。 use strict; use warnings; sub y { print qq/this is function named "y"\n/; } # y; # ... (1) &y; # ... (2) このまま実行すると [takeyuki@sunya ~]$ perl d.pl this is function …
AnyEvent::HTTP では、同一ホストに対して同時に接続する数を制限している。セマフォを使うのではなく、単なるカウンタを使っていることらしいことが、AnyEvent + Coro での並行ダウンローダの習作 その 2 - 昨日知ったことに引用したコードからわかった。し…
4x{d} - 昨日知ったことにコメントをいろいろいただいたのでさらに調査してみた。 print ()+{} 'print ()+{}' は、「print ($_)」の評価結果と無名ハッシュ「{}」の評価結果を加える、というものらしい。 [takeyuki@sunya ~]$ perl -MO=Deparse -e 'print ()…
AnyEvent::Util::guard を使ってみる。 use strict; use warnings; use AnyEvent::Util; sub gen { my $n = shift; my $guard = AnyEvent::Util::guard { print "terminated $n.\n"; }; print "created $n.\n"; $guard; } print "start\n"; { my $guard_0 = …
my $x =<<"- - - ->8 - - - -"; this is a test. - - - ->8 - - - - print $x;
オブジェクト指向プログラミングの発展系として、エージェント指向プログラミングというものがある。これに対する俺様的理解は、オブジェクトが「独自のデータとインタフェース」を持っているのに対し、さらに「独自のコードとスタック」も持っているのがエ…