Unrelated observation: you don't use strict;, do you? I highly suggest doing so; it'll catch many mistakes. For best results, also use warnings;.
I do use strict and warnings; I just didn't copy them with that code fragment.
Unrelated observation #2: your posted code doesn't actually work, does it? Your second foreach loop iterates over the keys of %{$data_hash{$key0}}, but %data_hash is supposed to contain (references to) arrays of hashes, not hashes.
You are correct, it doesn't. In my attempt to genericize the code I accidentally introduced some typos.