Getting your code working with PerlEx

Probably the most important thing to remember when rewriting code to work with PerlEx is data persistence. Since scripts do not "exit", all data stays in memory. If you depend on something to be empty, or filled from the results of previous code, declaring my $variable=""; in the early part of your code will clear up most data persistence errors.

Remember that BEGIN blocks are executed only when the script is compiled, i.e., the first time you run it. This means that you can open your log files, and your data files / data connections and then leave them open until the END block is run, i.e., on server shutdown, or when the script has been run the number of times defined by the Reload registry entry.

For the average user, Perl scripts should run with no changes. You will usually run into these issues only if the script makes assumptions about variables automatically becoming uninitialized when it is finished executing.

Exit handling

When executing a script that returns a non-zero exit value, PerlEx removes the script from its internal memory, and the script will be recompiled before it is next executed. A script that calls exit with the value "0", or with no argument, will not be removed from memory.

Lazy access to CGI and HTTP variables via %ENV

Under PerlEx, like under perl.exe, the environment variable hash %ENV is preloaded at startup with all the system environment variables. However, unlike perl.exe when it is running CGI programs, %ENV under PerlEx does not contain any of the HTTP and CGI variables when the script starts up, since doing this can be an expensive operation.

This means that a script running under PerlEx has to individually fetch each HTTP or CGI variable that it is interested in explicitly. When the script loads, keys(%ENV) will only return the keys from the system environment. After the initial fetch, these values will be cached in %ENV, so a subsequent keys(%ENV) will return the system variables along with any cached HTTP and CGI variables.

The following script illustrates this behavior when run under PerlEx:

#!/bin/perl 
print "Content-type: text/plain\n\n";
print "Startup environment:\n";
print "$_=$ENV{$_}\n" for sort keys %ENV;
print "-" x 75, "\n";
my (@list) = qw/GATEWAY_INTERFACE
		HTTPS
		HTTP_ACCEPT
		HTTP_ACCEPT_ENCODING 
		HTTP_ACCEPT_LANGUAGE
		HTTP_CONNECTION
		HTTP_HOST
		HTTP_REFERER 
		HTTP_USER_AGENT
		PATH
		REMOTE_ADDR
		REMOTE_HOST
		REQUEST_METHOD 
		SCRIPT_NAME
		SERVER_NAME
		SERVER_PORT
		SERVER_PROTOCOL
		SERVER_SOFTWARE 
		SERVER_URL
		SYSTEMROOT
		CONTENT_LENGTH/;

print "HTTP environment:\n"; 
print "$_=$ENV{$_}\n" for sort @list;
print "-" x 75, "\n";
print "Cached environment:\n"; 
print "$_=$ENV{$_}\n" for sort keys %ENV;

PerlEx handling of %ENV, @INC and Perl special global variables

After a script is compiled and ready to be executed, PerlEx saves the script's current %ENV, @INC, and the state of some of its Perl global variables ($@, $!, $,, $/, $\, $^W and $?). Each time the script is subsequently executed, PerlEx restores the state of these variables. Because the state is saved after the script is compiled, but before it is executed, any %ENV, @INC, or Perl global variable changes that take place in the BEGIN block will be in effect every time the script is executed.