Perl

ページの更新日を Google に聞いてくるスクリプトの書き方がわからない

あるページの更新日を Google に聞きたい。 Web::Scraper の scraper スクリプトを使って試してみたのだが、いまひとつわからない。"mato.me" について検索してみたところ。 scraper> process 'div.s', 'results[]' => scraper { process 'span', 'date' => …

携帯からメールを送ると twitter にツイートしてくれるアプリを作成する修行

携帯から twitter にツイートしたい。とりあえずツイートできればよくて、TL が見えなくても構わない。メールを送ったらその内容をツイートしてくれればいい。メールを送るだけならパケットも少なくて済むし。そういうアプリはすでにあるだろうが、自分専用…

Path::Class::Dir の children が「0」で止まること

Path::Class::Dir の recurse メソッドを使っていて、なぜか走査されないディレクトリがある。具体的には、サブディレクトリとして 0/, 1/, 2/, ..., e/, f/ があるのだが、0/ と 1/ と f/ の下のファイルが走査されない。試しに children で一覧してみると…

do ブロックを使って一時的な変数のスコープを狭める修行

最近、一時的に必要な変数のスコープを狭めるために 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); そういう例はみたことが…

List::MoreUtils::pairwise を使ってみる修行

二つの対応した文字列がある。もっと正確に言うと、それぞれをある記号で split したときの、各要素が対応している。対応した文字列要素のペアを基にごにょごにょして新しい要素を作り、それをリストにしたい。と、ややこしく書いているが、要するに List::M…

自作のモジュールを use してもロードされない問題に悩む修行

モジュールのロードについて実験するため、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) !…

Quine を書いてみる、エラー

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 を書いてみた。やってみてわかったことは、たいして面白くないってこと。ヒアドキュメント + 正規表現置換技、とはまったく別の方法の Quine を考える方が面白いだろう。 use strict; use warnings; my $x = <…

必須の引数とオプショナルな引数の順序に悩む修行

あるクラス Stuff のコンストラクタには文字列を渡す。 my $stuff = new Stuff($string); で、オプショナルな引数は名前つきの引数で渡したい。そのとき、こういう風に書くのはどうだろうか。 my $stuff = new Stuff(code => q/353/, flag => 1, $string); #…

foreach を last で抜けるとループ変数の値は保存されない

変数をループで回しながら、特定の条件にマッチしたところでループを抜け出し、条件にあった変数値を得たい、というときがある。そんなとき、次のようなコードを書いていた。 use strict; use warnings; my @candidates = qw/this is a test/; my $code; PRE…

$hash{ リスト } と書けないので

配列の場合は $array[リスト] と添字を指定して新たなリストが作れる。 $ perl -e '@x=(0..5);@y=@x[2,1,4];print @y' 214 ハッシュの場合も $hash{リスト} とキーを指定して新たなハッシュを作るか、そのキーの値のリストができるかすると嬉しい。 [takeyuk…

簡単で、ポータブルでなくて、低速な、国際化ドメイン変換モジュール

国際化ドメインをエンコード、デコードしたい。CPAN シェルを使ってインストールできるモジュールはなさそう (Punycode の encode/decode はどのモジュールを使えばいいのか考える修行 - 昨日知ったこと) なので自分で Pure Perl なモジュールを書かないとか…

for では $. はカウントされない

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 を書いてみる、ヒアドキュメントを使わずに

ヒアドキュメントを使わずに Quine を書いてみた。予想どおりヒアドキュメントを使うよりもサイズが大きい。s///;print を使う技ではこれが限界なんだろうか。 $,=chr(39);$_='$,=chr(39);$_=u;s/u/$,$_$,/;print';s/u/$,$_$,/;print [takeyuki@sunya ~]$ pe…

ここにも my が書けるのか

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/; } …

Quine を書いてみる、ヒアドキュメントをわかりやすく

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 と正規表現との違い

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 を書いてみる、初

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 …

-P オプションをつけると動作が変わるスクリプト

次のスクリプトは 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 節) を紹介し…

関数 y を呼ぶとき

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 の同時接続数制限を理解する修行、その1

AnyEvent::HTTP では、同一ホストに対して同時に接続する数を制限している。セマフォを使うのではなく、単なるカウンタを使っていることらしいことが、AnyEvent + Coro での並行ダウンローダの習作 その 2 - 昨日知ったことに引用したコードからわかった。し…

4x{d} の続き

4x{d} - 昨日知ったことにコメントをいろいろいただいたのでさらに調査してみた。 print ()+{} 'print ()+{}' は、「print ($_)」の評価結果と無名ハッシュ「{}」の評価結果を加える、というものらしい。 [takeyuki@sunya ~]$ perl -MO=Deparse -e 'print ()…

AnyEvent::Util::guard を使ってみる修行

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;

俺様エージェント指向俺様プログラミングによるエマープ生成

オブジェクト指向プログラミングの発展系として、エージェント指向プログラミングというものがある。これに対する俺様的理解は、オブジェクトが「独自のデータとインタフェース」を持っているのに対し、さらに「独自のコードとスタック」も持っているのがエ…