in reply to clean code

You've got a bit of superfluous characters. And your variables, which are lexically scoped to the block (= invisible outside that block), can have much simpler names.
foreach my $mem (split /;/, $memory_data) { my($name,$value) = split /=/, $mem, 2; $data{$name} = $value; }
I don't think this is that bad.

I've applied sfink's advice, which is my recommendation too.