いろいろ言及ありがとうございます。
刺身が再帰的にたんぽぽを乗せられる - Yappo::タワシ の後半にかかれていますが、おっしゃるとおり、 category が入れ子になっていたら全部保持したかったんです。再帰で潜っていく様子を考えてばかりいたら頭がぐるぐるしてきて、そこのところをさっぱり忘れていました。
push @links, hash_recursively($value, [ @{ $category_name }, $key ]);
みたいなのが思いつかないんだよなあ。 push の第二引数に hash_recursively() の呼び出しを持ってくる、みたいなところです。
考えてもわからないので、教えてもらったコードを参考に動くものを作って覚えていこうと思います。どうもありがとうございました。