From: Greg Ercolano <erco@(email surpressed)> Subject: [Q+A] Setting environment variables in the perl submit scripts Date: Tue, 05 Dec 2006 19:56:16 -0500 |
Msg# 1432 View Complete Thread (2 articles) | All Threads Last Next |
I needed to make some custom environment variables at the top of our perl submit scripts, but sometimes perl doesn't seem to like some of our settings. For instance, these [three] settings cause errors: $ENV{APP_PLUGIN_DIR} = "c:\internal\our_app\libs"; # BAD $ENV{APP_LICENSE_FILE} = "7700@licserve01"; # BAD $ENV{PATH} = "\\isolan\apps\our_app\bin;$ENV{PATH}"; # BAD Why doesn't perl like those settings? Right; in Perl backslashes (\) and '@' are special characters, and Perl allows those character's special meanings inside double quotes ("). They have to be 'escaped' to protect them from being interpreted by perl. (Other shell languages like CSH and C need this too). You can protect the meaning of those special characters by putting a backslash escape in front of each special character, eg: $ENV{APP_PLUGIN_DIR} = "c:\\internal\\our_app\\libs"; # OK $ENV{APP_LICENSE_FILE} = "7700\@licserve01"; # OK $ENV{PATH} = "\\\\isolan\\apps\\our_app\\bin;$ENV{PATH}"; # OK Another approach is to replace the double quotes with single quotes, as in these cases single quotes will properly protect the special characters: $ENV{APP_PLUGIN_DIR} = 'c:\internal\our_app\libs'; # OK $ENV{APP_LICENSE_FILE} = '7700@licserve01'; # OK $ENV{PATH} = '\\\\isolan\apps\our_app\bin;'.$ENV{PATH}; # OK *But* there are caveats with single quotes esp. when double backslashes are needed (like that 3rd line), such as with UNC paths: $ENV{PATH} = '\\isolan\apps\our_app\bin;$ENV{PATH}"; # FAIL That doesn't work, because perl still interprets \\ as an escape sequence for a single backslash, even in single quotes. To get a double backslash even in a single quoted string, you still have to double up the backslashes: $ENV{PATH} = '\\\\isolan\apps\our_app\bin;'.$ENV{PATH}; # OK ^^^^ Why, you may ask, does Perl need to support escaping a backslash if single backslashes are already protected? Well, it's the only way to insert a backslash at the *end* of a single quoted string, eg: $foo = '\some\path\dir\'; # FAIL $foo = '\some\path\dir\\'; # OK The first line fails because that \' at the end makes perl think you're trying to embed a single quote in the string. So for that one case, Perl needs to be able to escape the meaning of the backslash, hence the extra slash. This is why I tell everyone to use FRONT SLASHES instead of backslashes whenever possible, because there's nothing 'special' about them: $ENV{APP_PLUGIN_DIR} = "c:/internal/our_app/libs"; # OK $ENV{PATH} = "//isolan/apps/our_app/bin;$ENV{PATH}"; # OK This avoids all the hassles of backslashes being mistaken for escape sequences. This is all Microsoft's fault for choosing (and continuing to use) backslashes as directory delimiters. It's caused nothing but trouble for decades with C, C++ and shell script programs. Fortunately Microsoft supports the use of front slashes at the WIN32 kernel level, so in most cases (esp. with environment settings) front slashes work equally well. |
From: Greg Ercolano <erco@(email surpressed)> Subject: Re: [Q+A] Setting environment variables in the perl submit scripts Date: Tue, 05 Dec 2006 20:14:22 -0500 |
Msg# 1433 View Complete Thread (2 articles) | All Threads Last Next |
Oops; to those on the mailing list, I had to make some fixes to that last message. The copy you have in your emails will have mistakes. The web archive and newsgroup articles have the corrected version: http://seriss.com/cgi-bin/rush/newsgroup-threaded.cgi?-view+1432 |