2011-03-07
■[Perl]ハッシュの代入式を返り値にしたときのバグっぽいもの

use 5.010; use strict; use warnings; use Data::Dumper; sub merge_hash { my %a = (X => 1, Y => 2); my %b = (Y => 3); my %c = (%a, %b); } my %ret = merge_hash(); print Dumper \%ret; # --> {'Y' => undef}
関数の返り値がハッシュ変数への代入式の値で、かつ左辺に重複するキーが含まれているとき返り値が壊れるっぽい。
環境は This is perl 5, version 12, subversion 1 (v5.12.1) built for darwin-2level。
追記
perl 5.13.10 では問題ない({'X' => 1, 'Y' => 3} が返る)ことを確認しました。
■[Perl][Synopsis]Web::Scraper の覚書

use Web::Scraper; my $scraper = scraper { # CSS sel. or XPath | name -> scalar | 'TEXT' 'HTML' '@attr' # | name[] -> arrayref | { } sub{ } process 'foo>bar>baz.spam', 'item' => 'TEXT'; process 'img', 'images[]' => { 'src' => '@src', 'alt' => '@alt', 'size' => sub { my $elem = shift; # isa HTML::Element $elem->attr('width') * $elem->('height'); }, }; process 'ul', 'ul' => scraper { process 'li', 'li[]' => 'TEXT'; result 'li'; # makes the scraper result [TEXT, ...] # instead of {li => [TEXT, ...]} }; }; # custom UA use LWP::UserAgent; my $ua = LWP::UserAgent->new(agent => 'Mozilla blahblah'); $scraper->user_agent($ua); # something to be scraped use File::Slurp qw(slurp); use URI; my $content = slurp('example.html'); my $uri = URI->new('http://example.com/'); # do it my $result; $result = $scraper->scrape($content); $result = $scraper->scrape($uri); $result = $scraper->scrape($content, $uri); # as base URI
■[Git]フリープランでも GitHub にプライベートリポジトリを作れる裏ワザ

まえおき
GitHub のフリープランはパブリックリポジトリを無制限に作れますが、プライベートリポジトリを作ることはできません。 BitBucket ならどっちも無制限なのに! なんとかして自分専用のリポジトリを作りたい! タダで!
というわけでそんな方法を見つけました。
tl;dr
gist.github.com で プライベート gist を作れ! master 以外のブランチを使え!
解説
gist.github.com はいわゆる pastebin で、適当なコード片を貼り付けることができます。各コード片(gist)は git リポジトリになっていて普通に clone することができます。
Web インターフェースから行えるのはファイルの作成と編集、削除だけですが、リポジトリをローカルに clone してしまえば普段通りの作業ができるわけです。
しかし、このリポジトリにサブディレクトリを作って push すると次のような警告が表示されてしまいます。
メインの GitHub リポジトリと差別化するためか、 gist リポジトリにサブディレクトリを作ることを禁じているようです。 ${repo}/hara/ 以下に置いた peko.txt は ${repo}/foo.txt と同列に表示されています。
ただし。 Web インターフェースに表示されるのは master ブランチの内容だけです。 master 以外のブランチに何が入っていようが文句は言われません。
つまり、適当なファイルを置いた master ブランチを隠れ蓑にすれば、他のブランチを自由に勝手に無尽蔵に使うことができるのです。
まとめ
- gist.github.com でプライベート gist を作る
- master には適当なファイルを置いておく
- master 以外のブランチで気ままに開発!
免責
gist のリポジトリのサイズに上限があるかどうかは確かめていません。こういう使い方をして怒られても僕は知りません。何も知りません。
■[Perl]一発で App::FatPacker するスクリプトを(だいぶ前に)書いた

のを Twitter でちょろっと言って放置してたんだけど、たまーに参照されてるみたいなのでちゃんと書いとくことにしました。
https://gist.github.com/385661
$ fatpack trace myscript.pl $ fatpack packlists-for `cat fatpacker.trace` >packlists $ fatpack tree `cat packlists` $ (fatpack file; cat myscript.pl) >myscript.packed.pl
ごちゃごちゃーっとしたのが
$ fastpack myscript.pl > myscript.packed.pl
こうなります。ピャッとね。
追記
gfx
2011/03/08 01:31
5.13.xだと修正されてますね。
uasi
2011/03/10 20:30
確認しました。ご指摘ありがとうございます。


