Datareign

Under Unix, Perl plays very nicely with external processes. Suppose you want to run a process and retrieve its return value. All you need to do is something like…

 $Result = `ls *.sql`

The problem is that this doesn't work at all on Windows so, if you want your programme to be fully portable, you need a workaround. My solution is to use the one common feature on both Windows and Unix, the redirection character (>).

Say I want to run a SQL query (because this is something I do frequently, I have a subroutine for it)

 # =======================================
 # Runs an SQL file, returning the result.
 # ---------------------------------------
 # $_[0] is the connection string.
 # $_[1] is the file to run.
 # $_[2] is a file to write the result to.
 # ---------------------------------------
 # (This last is necessary because the ``
 # syntax does not work in Windows.)
 # =======================================
 sub RunSqlQuery
 {
   my $V_COMMAND = "sqlplus "
                 . $C_SQLPLUS_FLAGS
                 . " "
                 . $_[0]
                 ." \@"
                 . $_[1]
                 . " >"
                 . $_[2];
   my $V_RESULT;
   
   # --------------------------------
   # Run the command created above...
   # --------------------------------
   system $V_COMMAND;
   
   # ---------------------------------
   # Get the result back from the file
   # and send it up the call chain...
   # ---------------------------------
   $V_RESULT = ReadResultFile $_[2];
   return $V_RESULT;
 }

Now the above piece of code will work, unaltered, on both Windows and Unix. Then all we need to get at the result is to have a matching subroutine to extract the values…

 # ===============================================
 # Reads a file in which a result has been placed.
 # -----------------------------------------------
 # $_[0] name of the file to read.
 # -----------------------------------------------
 # This is one of the workarounds made necessary
 # because the syntax "VAR=`command`" does not
 # work in Windows the same as it does in Unix.
 # ===============================================
 sub ReadResultFile
 {
   my $V_BUFFER;
   open(H_SQL_FILE, "<$_[0]") or die "FAILURE: Cannot open " . $_[0];
   read H_SQL_FILE, $V_BUFFER, 65535;
   close H_SQL_FILE;
   return $V_BUFFER;
 }

Note that the read command arbitrarily limits the size of the file to 65535 bytes and you may wish to alter this for your own requirements.

Last modified: 2009/01/03 19:16