Example of a perl script calling a SAS programming running under cgi-bin. You will have to modify this to reflect your own computing environment. The script parses arguments passed in from a form and passes them to a SAS program as a sysparm. The SAS program is invoked so it writes to stdout. The perl script reads the SAS output and formats the output into an html page for the user.
lines 32-56: Read the environment variables entered on the form and build the
appropriate SAS command line.
lines 58-73: Open pipes to the SAS process, execute the SAS program and
read the output from stdin.
lines 74-88: Format the SAS output as an html page. Note that the SAS program
knows nothing about the intended use of its output -- it merely streams it to stdout.
1 #! /usr/bin/perl -s
2
3 $debug = 0;
4
5 if ($debug==1) { $log = "debug.log"; }
6 else { $log = "/dev/null"; }
7
8 # set up various things that SAS needs on command line
9
10 $sas = "/usr/sas/sas";
11 $config = "/usr/sas/config.sas611";
12 $tmp = "/tmp";
13 $work = "/SAStmp";
14 $sasopts = "-stdio -sasuser $tmp -config $config -work $work";
15 $prog = "/webserver/a/https/cgi-bin/test_program.sas";
16
17 # set up environment
18 # most vars unassigned when executing cgi-bin
19
20 $home = "/webserver/a/httpd";
21 $sasroot = "/usr/sas";
22 $terminfo = "/usr/sas/terminfo";
23 $terminfoadd = "/usr/sas/terminfo";
24 $path = "/usr/bin:/usr/local/bin:.";
25
26 $ENV{'HOME'}=$home;
27 $ENV{'SASROOT'}=$sasroot;
28 $ENV{'TERMINFO'}=$terminfo;
29 $ENV{'TERMINFOADD'}=$terminfoadd;
30 $ENV{'PATH'}=$path;
31
32 #$err = system("/usr/sas/utilities/bin/cleanwork $work");
33
34 # get and decode name value pairs from form
35
36 if ($ENV{'REQUEST_METHOD'} eq "get") { $buffer = $ENV{'QUERY_STRING'}; }
37 else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
38
39 @pairs = split(/&/, $buffer);
40
41 # sysparm will be sent to SAS
42 # it consists of and argument count plus vars to be passed to program
43 # sysparm is built by concatenating in loop below
44
45 $cnt = $#pairs + 1; # sas starts counting at 1
46 $sysparm = "$cnt";
47
48 foreach $pair (@pairs)
49 {
50 ($name, $value) = split(/=/, $pair);
51 $value =~ tr/+/ /;
52 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
53 $sysparm = $sysparm." ".$value;
54 }
55
56 $doit = "$sas $sasopts -sysparm '$sysparm'";
57
58 # open pipe to stdin and fork sas process
59
60 open(SAS, "-|") ||
61 (open(STDERR, ">$log") &&
62 open(STDIN, $prog) &&
63 exec($doit) ||
64 exit(1));
65
66 # slurp in sas output
67
68 @sasoutput = <SAS>;
69 close SAS;
70 if ($#sasoutput==0) {
71 @sasoutput = ("SAS job failed\n");
72 }
73
74 # generate html
75
76 print "content-type: text/html\n\n";
77 print "<html>";
78 print "<title>$prog</title>";
79 print "<body>";
80 print "<hr>";
81 print "<pre>";
82
83 print join("", @sasoutput);
84
85 print "</pre>";
86 print "<hr>";
87 print "</body>";
88 print "</html>";