On Tue, Mar 19, 2002 at 10:46:04AM +1100, [EMAIL PROTECTED] wrote: > > In an attempt to stimulate non-golf threads: > > .. Has anybody done any really interesting Perl "hacks" that they are > proud of?
Yeah, I do actually. Recently I was writing a program that needed to (shell) source a file, to get some environment variables set, and use those variables in further calculations. I could of course have written a shell wrapper that sourced the file, then started my program. But I decided I just wanted a single program. To source a shell file, one cannot use 'system' - that would start a child process, and setting the environment in the child is pointless. So, I decided to use a trick, a double exec. First I exec a shell that is sourcing the file with the environment variables, then I exec the original program - with a special argument to indicate the variables have been set. The relevant part of said program follows. Abigail my $ENVIRONMENT = "/some/file/somewhere"; if (@ARGV && $ARGV [0] eq '--sourced_environment') { shift; } else { if (-f $ENVIRONMENT) { # # Now we perform a double exec. The first exec gives us a shell, # allowing us the source the file with the environment variables. # Then, from within the shell we re-exec ourself - but with an # argument that will prevent us from going into infinite recursion. # # We cannot do a 'system "source $ENVIRONMENT"', because # environment variables are not propagated to the parent. # # Note the required trickery to do the appropriate shell quoting # when passing @ARGV back to ourselves. # @ARGV = map {s/'/'"'"'/g; "'$_'"} @ARGV; exec << " --"; source '$ENVIRONMENT' exec $0 --sourced_environment @ARGV; -- die "This should never happen."; } }