Perlでのuse Contantとハッシュのキー
use contantで定義した値をハッシュのキーに入れたら、ハマってしまった。
ちょいと悩んでから、単純に文字列として解釈されていることに気づいた。いろいろ試行錯誤しして、スコープ演算子の :: をその定数の前につけてやれば文字列としてではなく、きちんと定数として解釈されることに気づいた。もしパッケージの中で定義していて、しかもエクスポートしていない場合には、パッケージ名も加えてやればよい。
たとえば、
use strict; use warnings; use constant{ CONF_HOGEHOGE => 'hogehoge', }; my $conf = {CONF_HOGEHOGE => 'abc'}; # これではダメ printf("dame: %s\n", $conf->{CONF_HOGEHOGE}); # こうする printf("ok: %s\n", $conf->{::CONF_HOGEHOGE});
この場合のミソは、ハッシュキーの中でタイプミスをした場合でも、実行前のコンパイル段階でちゃんと補足されること。
# あっ!? printf("ok: %s\n", $conf->{::CONF_HOGEHOG}); > ./a.pl Bareword "::CONF_HOGEHOG" not allowed while "strict subs" in use at ./a.pl line 14. Execution of ./a.pl aborted due to compilation errors.
実行前に補足できるのでこれはうれしいところ。