2005/02/25
連想配列って難儀すぎ
野暮用でこんなスクリプトを作らなければならないので作ったんだが、結果があまりにも酷かった。
#!/usr/bin/perl

$TEST{'STR'} = 'PC';
$TEST{'STR'}{'1'} = 'STR-1 values.';
$TEST{'VAL'} = 2;
$TEST{'VAL'}{'2'} = 'VAL-2 values.';
$TEST{'DAT'} = "テスト";
$TEST{'DAT'}{'3'} = 'DAT-3 values.';

td();

sub td {
        foreach $mk (keys %TEST) {
                print ">$mk\n";
                foreach $sk (keys %{$TEST{$mk}}) { print ">     $sk: $TEST{$mk}{$sk}\n"; }
        }
        return undef;
}
メインカテゴリとサブカテゴリを表示するというスクリプトなのだが、以下のような結果を期待していた。
>>>STR
>1: STR-1 values.
>>>VAL
>2: VAL-2 values.
>>>DAT
>3: DAT-3 values.
しかし結果はあまりにも無惨で以下のような結果となった。
>>>STR
>>>VAL
>2: VAL-2 values.
>>>DAT
>3: DAT-3 values.
連想配列名 "STR" のサブ連想配列が出てこないのだ。
これにはまいった。
何がまいったかというと、1バイト文字列では出てこないのに、2バイト文字列もしくは数列にすると "VAL" と "DAT" のように出てくるのだ。


これは使えない。('A`)


流石にユーザーに「カテゴリ名(表示用)はかならず 2バイト文字から始めてね」などと恥ずかしい指定は出来ない。
しかたがないので %CATEGORY と %SUBCATEGORY を作成して対応。

うーん、美しくない。

で、この影響なんだが、実は右テーブルのカテゴリリスト内にある「PC関連」に影響が出ていた。
なんと、サブカテゴリがいくつかあるのにそれが出てこず 1つのカテゴリにしかなっていなかった。(汗)

今までは普通に動いてたんだけどなぁ・・・。('A`)

  • たわし:>流石にユーザーに「カテゴリ名(表示用)はかならず 2バイト文字から始めてね」などと恥ずかしい指定は出来ない。
    だから、マスタテーブルで管理すればヨロシ
    テーブル結合で無問題
  • G兄:いや、連想配列を使う時点でアウトなんですよ。
    使わなければいいっつーのは無理な話で・・・。
  • tnjhttp://nothing.sh/temp/050225_test.pl
    これでいいんじゃ?
  • G兄:おぉ、それでいけましたありがとん!
    でもなんでkeysで例の構造だとダメなんだろう・・・。
  • tnj:よくわかんないけど、とりあえず元のコードでもうちではちゃんと動作したんですけどね(えー
    ActivePerl 5.8.6 @ WinXP と Perl 5.8.2 @ Linux で確認。
  • G兄:うちだとダメだった・・・。

    で、今確認したら再現しない。
    なぜ!?
QRコード
携帯サイト試験運用
https://griffonworks.net/nikki/cgi-bin/k.cgi
1行板

備忘録
  • 無し
物欲リスト
  • Canon RF50mm F1.2L USM
  • SIGMA 20mm F1.4 EF Art
  • ニンバス チヌーク
  • OCB-1 ST II
ツーリング ドライブ兼野外撮影予定リスト