hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
07/06/2009 あー [長年日記]
tDiary 2447日目
■ [Perl] 眠れぬ夜に return %hash
眠れないので今日数分悩んでしまったことでも書くか.
いまだに Perl の言語仕様にハマることがある. 気付けば大したことではないのだけれど.
use strict; use warnings; sub unko1 { my %hash = ( 'unko' => 'buriburi' ); return %hash; } sub unko2 { my %hash = ( 'unko' => 'morimori' ); return \%hash; } if ( $0 eq __FILE__ ) { print keys( &unko1() ), "\n"; print keys( %{ &unko2() } ), "\n"; }
keys( &unko1() ) は動かないが keys( %{ &unko2() } ) は動く. 気付くまでは「ハァ?」って感じなのだが, Perl の関数はスカラーかリストかしか返せないので, &unko1() の返値であるリストを keys に食わせられないと.
まあリストしか返せないこと自体「ハァ?」と言いたくもなるのだが, そこは Perl を使う以上,もう触らぬ神にたたりなしか.
ただエラーメッセージが分かりにくいのが困りもので, "not subroutine entry" とか出るせいで逆に混乱する. 実行時でなくコンパイル時のエラーなのでこう出てしまうのはしょうがないと言えばしょうがないのだけれど,何だかなあ. プロトタイプ宣言した時のような挙動.
Type of arg 1 to keys must be hash (not subroutine entry) at hoge.pl line 15, near ") )" Execution of hoge.pl aborted due to compilation errors.
プロトタイプ宣言と言えば,&@ とかでプロトタイプ宣言した時の挙動も気にかかる. 例えばこんなの↓. 便利なのは分かるけど,なんだかなあ... $_ の参照もきもい.
use strict; use warnings; sub unko (&@) { my $func = shift; map { $func->() } @_; } if ( $0 eq __FILE__ ) { unko { print "$_!!\n" } qw/anta gata doko sa higo sa higo doko sa/; }
ここまできたらもう 1 つこんなの↓. Encode.pm でも使われている有名テクとはいえ, 知らない人が見たら「ちょwww おまwwww」ですよ. リファレンスならいざ知らず,まさか殻ごと破壊されるとは思うまい...
use strict; use warnings; sub hoge { $_[0] = 'omae no ka-chan debeso'; return 'uhihi'; } if ( $0 eq __FILE__ ) { my $val = 'umu'; print &hoge($val), "\n"; print $val, "\n"; }
そりゃこんなんもりもり書いてたら Write once, Read never とか揶揄もされるわ.
perlのハッシュに関する記述、役立ちました。ありがとう。