Just wanted to note: certain parts of nsPerl do *not* work as advertised.
Mainly the NS_getvar and NS_setvar functions exported to perl. They're there, they're exported to it, but they don't work when called from a script file (they work when called using an inline perl function, though)
I have managed to get around the issue in a horrible, ugly, kludgy way, like so:
1) in the NSI script, open a file, say for instance, $TEMP\vars.pl
2) write to the file like so: "$$FOO = '$FOO';$\n1;$\n"
3) close the file
4) call the script, which has been written specifically to require this file, at which point it's read these variables in by way of the require file.
You could alter the approach but it remains kludgy. For instance, you could just write variable to a file separated by a character the strings don't use and open, read and parse it in Perl. You could theoretically call the perlscript with a system call from an exec line to rundll32 on perl58.dll, and pass in the variables as arguments to the script. ut that's nightmarishly confuzzling. Theoretically, you could even write these data into the registry, and use the Perl Win32::Registry module to read them back out. I'd suggest writing them to the environment, but I'm not sure the perlscript would have the same environment as the installer exe and I haven't tested it.
Needless to say, however you do it, if you plan to use nsPerl, which is a great idea but a little bit broken, keep this in mind.
For the record, while I was able to get the 'ok' or 'error' string back from a perl script exec call as documented, the second return value was NOT, as advertised, the last value instanced in perl if ok or the error message if error. Instead, it was just 1. All the time. Nothing but 1. So don't count on that either. Validate that your script ran worked correctly some other way. It's tough to test this stuff without proper IPC, but it *can* be done. Slowly.
Anyway, when I am done I will have something very cool indeed: effectively, a sort of 3d model patch program (for Alias Wavefront OBJects) built into an installer, allowing derived meshes to be distributed without any of the original, preserving the distributor from both packaging headaches AND copyright messes!