This solution has the following serious shortcomings, listed in order of increasing seriousness:
It isn't in a BEGIN block, so will not protect you from trying to load modules that aren't there.
You lose @ARGV.
It gets into an endless loop - you need to test whether you have the *right* version of Perl, else when you get the right one, you will keep on thinking that you have the wrong one and exec again.