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.

実行前に補足できるのでこれはうれしいところ。