May be of interest; I came across String::ShellQuote, very nice, escapes anything..
Nope, it doesn't quote "anything". It works just for some unnamed version of some unnamed bourne shell. The author wanted to add more shells, but he did not since 2005. The test.t look very strange, especially I don't see any reasonable test for passing arguments via a shell.
So, it's old, unmaintained, not well-tested, and broken for all shells except for that unspecified bourne shell. Use the multi-argument forms of exec, system, or open instead, they do not need quoting.
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)