Wow, why the switch to insane variable names? You're not even separating the words! Your code is unreadable. (Wall of text.)
Anyway, you always discard the result of decode_entities, so I don't see how you could claim it ever works.
And the order of the following statements is backwards:$decodedParsedContent =~ s/(\s)+/ /g; # remove double whitespace decode_entities(my $decodedParsedContentWithDecodeEntities = $decodedP +arsedContent);
You're removing the spaces before you decode the entities that might result in spaces.
Finally, s/(\s)+/ /g is wrong. Except ? in some very special circumstances, applying a modifier to a capture makes no sense. Which brings to the point that you don't need to be capturing at all. If you need parens, they're (?...): s/(?:\s)+/ /g. Of course, there's one one atom in the parens, so all you need is s/\s+/ /g.
Update: "If called in void context the arguments are decoded in-place.", oops.
Your test produces waaaaay too much output, so I can't even see the problem, much less diagnose it.