in reply to Getopt::Long loses char

There is nothing you can do in your Perl program. The characters are gone before Perl has begun running. The ^ is a continuation character for the Windows shell and % is the variable substitution character. It's the responsibility of whoever runs your program to make sure that any special characters are quoted/doubled/escaped.

For example, you can say perl test.pl --str=$%^^@*jimbo