Perl CGI Hello World: Difference between revisions
m
Reverted edits by Upazixorys (Talk); changed back to last version by Ric
Upazixorys (talk | contribs) No edit summary |
m (Reverted edits by Upazixorys (Talk); changed back to last version by Ric) |
||
Line 1: | Line 1: | ||
<span id="top"></span> | |||
{| cellpadding="2" | |||
{| cellpadding= | |||
|__TOC__||'''Perl CGI - Hello World''' | |__TOC__||'''Perl CGI - Hello World''' | ||
|} | |} | ||
Line 13: | Line 12: | ||
{| | {| | ||
|- | |- | ||
!Shebang!!& | !Shebang!! ||Notes | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre>#!/usr/bin/perl</pre> | |||
| | | | ||
& | | ||
| | | | ||
It has the following format: Starts with a hash | It has the following format: Starts with a hash "'''<nowiki>#</nowiki>'''" followed by an exclamation mark "'''!'''" and then the complete path on your system to the '''Perl''' program itself. | ||
The shebang shown corresponds to Uniform Server running either in portable-mode (basic) or disk-root. The line informs Apache where to find the Perl program, | The shebang shown corresponds to Uniform Server running either in portable-mode (basic) or disk-root. The line informs Apache where to find the Perl program, "'''/'''" means start at the top level of a disk then follow the folder path '''usr''', '''bin''' and finally the name of the Perl program '''perl'''.exe note the file extension is assumed. | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre>#!c:/UniServer/usr/bin/perl</pre> | |||
| | | | ||
& | | ||
| | | | ||
When Uniform Server is installed as a service all Perl shebangs are changed to match the installation path. An example of this shebang is shown for a default installation of Mona installed as a service. Hence when writing new scripts remember to use the correct path for the shebang. | When Uniform Server is installed as a service all Perl shebangs are changed to match the installation path. An example of this shebang is shown for a default installation of Mona installed as a service. Hence when writing new scripts remember to use the correct path for the shebang. | ||
Line 33: | Line 32: | ||
'''''Note 1'':''' The shebang can take parameters the most useful is '''-w''' it enables warnings remove it on finished scripts. | '''''Note 1'':''' The shebang can take parameters the most useful is '''-w''' it enables warnings remove it on finished scripts. | ||
* | * <nowiki>#!/usr/bin/perl -w</nowiki> | ||
* | * <nowiki>#!c:/UniServer/usr/bin/perl -w</nowiki> | ||
'''''Note 2'':''' Forward slashes are Unix paths if you wish you can use a back slash the path must be enclosed in quotes. | '''''Note 2'':''' Forward slashes are Unix paths if you wish you can use a back slash the path must be enclosed in quotes. | ||
* | * <nowiki>#!"\usr\bin\perl"</nowiki> | ||
* | * <nowiki>#!"c:\UniServer\usr\bin\perl"</nowiki> | ||
'''''Note 3'':''' For maximum computability always use '''forward slashes''' and run Uniform Server in portable or disk-root mode. | '''''Note 3'':''' For maximum computability always use '''forward slashes''' and run Uniform Server in portable or disk-root mode. | ||
Line 46: | Line 45: | ||
The first thing a CGI script must perform is to output a header. This header is checked by Apache and then passed on to a users browser informing it what type of file to expect. In the hello world examples we are outputting an HTML file hence the header looks like this: | The first thing a CGI script must perform is to output a header. This header is checked by Apache and then passed on to a users browser informing it what type of file to expect. In the hello world examples we are outputting an HTML file hence the header looks like this: | ||
{| | {| | ||
|valign= | |valign="top"| | ||
<pre>print "Content-type: text/html\n\n";</pre> | |||
| | | | ||
& | | ||
| | | | ||
Its important to output it exactly as shown. Must start with a capital | Its important to output it exactly as shown. Must start with a capital "C" followed by lowercase characters. Of importance are the two newline characters (\n\n) at the end of the header. The header needs to be followed by a blank line hence the second newline character. | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre>print "Content-type: text/html\r\n\r\n";</pre> | |||
| | | | ||
& | | ||
|valign= | |valign="top"| | ||
The above works fine on Windows. | The above works fine on Windows. | ||
Line 70: | Line 69: | ||
|- | |- | ||
| | | | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
# test_1.pl - First Perl Script! | # test_1.pl - First Perl Script! | ||
print | print "Content-type: text/html\r\n\r\n"; | ||
print | print "Hello World\n"; # Comment starts | ||
</pre> | |||
| | | | ||
& | | ||
| | | | ||
The first line is the shebang informing Apache where to find the Perl program. | The first line is the shebang informing Apache where to find the Perl program. | ||
The second line starts with a hash | The second line starts with a hash "#" indicating the start of a comment, any character after this up to the end of a line are ignored. Although the shebang starts with a hash it is not a comment because it is combined with an exclamation mark the two together define a shebang. You can start a comment anywhere along a line, if a line is Perl code a comment must start after the line terminator character ";" semi-column. | ||
|} | |} | ||
The third lines outputs (prints) the header. | The third lines outputs (prints) the header. | ||
Line 92: | Line 91: | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: ''' | * Type the following into a browser: '''<nowiki>http://localhost/cgi-bin/test_1.pl</nowiki>''' | ||
'''''[[#top | Top]]''''' | '''''[[#top | Top]]''''' | ||
== Script 2 - Basic HTML == | == Script 2 - Basic HTML == | ||
Line 100: | Line 99: | ||
{| | {| | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
# test_2.pl - Second Perl Script! | # test_2.pl - Second Perl Script! | ||
print | print "Content-type: text/html\r\n\r\n"; | ||
print | print "<HTML>"; | ||
print | print "<HEAD>"; | ||
print | print "<TITLE>Hello World</TITLE>"; | ||
print | print "</HEAD>"; | ||
print | print "<BODY>"; | ||
print | print "<H1>Hello World</H1>"; | ||
print | print "</BODY>"; | ||
print | print "</HTML>"; | ||
</pre> | |||
| | | | ||
& | | ||
|valign= | |valign="top"| | ||
The code is similar to the above includes a shebang, comment and header line. | The code is similar to the above includes a shebang, comment and header line. | ||
Line 127: | Line 126: | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: ''' | * Type the following into a browser: '''<nowiki>http://localhost/cgi-bin/test_2.pl</nowiki>''' | ||
A page full of print statements becomes very tedious the next script makes the task a little easier. | A page full of print statements becomes very tedious the next script makes the task a little easier. | ||
Line 137: | Line 136: | ||
{| | {| | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
# test_3.pl - Third Perl Script! | # test_3.pl - Third Perl Script! | ||
print | print "Content-type: text/html\r\n\r\n"; | ||
print | print <<"EOF123"; | ||
<HTML> | |||
<HEAD> | |||
<TITLE>Hello World</TITLE> | |||
</HEAD> | |||
<BODY> | |||
<H1>Hello World</H1> | |||
</BODY> | |||
</HTML> | |||
EOF123 | EOF123 | ||
</pre> | |||
| | | | ||
& | | ||
|valign= | |valign="top"| | ||
With the exception of the header all print statements have been replaced with two special markers. | With the exception of the header all print statements have been replaced with two special markers. | ||
A block of text to be printed is enclosed between''' print | A block of text to be printed is enclosed between''' print <<"EOF123";''' and '''EOF123''' start and end tags respectively. | ||
'''''Note 1'':''' There's nothing special about the | '''''Note 1'':''' There's nothing special about the "EOF123" string use anything you like however it must be identical in both cases. | ||
'''''Note 2'':''' The end tag '''EOF123''' must be place on its own line and no spaces are allowed at either the beging or end of the statement. | '''''Note 2'':''' The end tag '''EOF123''' must be place on its own line and no spaces are allowed at either the beging or end of the statement. | ||
Line 170: | Line 169: | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: ''' | * Type the following into a browser: '''<nowiki>http://localhost/cgi-bin/test_3.pl</nowiki>''' | ||
Using here-doc is a real time-saver. | Using here-doc is a real time-saver. | ||
|} | |} | ||
Line 178: | Line 177: | ||
== Script 4 - Basic HTML CGI.pm function-oriented == | == Script 4 - Basic HTML CGI.pm function-oriented == | ||
CGI.pm has two faces either function-oriented or object-oriented. This example shows how to use the function interface. The command '''Use CGI''' takes a parameter this allows us to import a set of functions from the CGI module. This example imports the | CGI.pm has two faces either function-oriented or object-oriented. This example shows how to use the function interface. The command '''Use CGI''' takes a parameter this allows us to import a set of functions from the CGI module. This example imports the "'''standard'''" set of functions from this module. | ||
{| | {| | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
Line 193: | Line 192: | ||
h1('Hello World'), # level 1 header | h1('Hello World'), # level 1 header | ||
end_html; # end of HTML | end_html; # end of HTML | ||
</pre> | |||
| | | | ||
& | | ||
|valign= | |valign="top"| | ||
<br>'''''Running the script''''' | |||
* Create a text file and copy the script. Save the file with name '''test_4.pl''' | * Create a text file and copy the script. Save the file with name '''test_4.pl''' | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: ''' | * Type the following into a browser: '''<nowiki>http://localhost/cgi-bin/test_4.pl</nowiki>''' | ||
|} | |} | ||
The above is intended to provide a working example in no way does it indicate the enormity and flexibility of this module. | The above is intended to provide a working example in no way does it indicate the enormity and flexibility of this module. | ||
Line 212: | Line 211: | ||
{| | {| | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
Line 220: | Line 219: | ||
use CGI; # load CGI functions | use CGI; # load CGI functions | ||
$q = new CGI; # create new CGI object | $q = new CGI; # create new CGI object | ||
print $q- | print $q->header, # create HTTP header | ||
$q- | $q->start_html('Hello World'), # start of HTML | ||
$q- | $q->h1('Hello World'), # level 1 header | ||
$q- | $q->end_html; # end of HTML | ||
</pre> | |||
| | | | ||
& | | ||
|valign= | |valign="top"| | ||
<br>'''''Running the script''''' | |||
* Create a text file and copy the script. Save the file with name '''test_5.pl''' | * Create a text file and copy the script. Save the file with name '''test_5.pl''' | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: ''' | * Type the following into a browser: '''<nowiki>http://localhost/cgi-bin/test_5.pl</nowiki>''' | ||
|} | |} | ||
Again the objective is to provide a working example. The above gives you some idea of the modules capabilities take a look at Perl's doc for more information. | Again the objective is to provide a working example. The above gives you some idea of the modules capabilities take a look at Perl's doc for more information. | ||
Line 240: | Line 239: | ||
When a form is submitted its easy to pick-up the query string and process it. There is no need to use a form the query string can be included with the URL. This example demostrates the principal. | When a form is submitted its easy to pick-up the query string and process it. There is no need to use a form the query string can be included with the URL. This example demostrates the principal. | ||
URL: ''' | URL: '''<nowiki>http://localhost/cgi-bin/test_6.pl?part1=Hello&part2=World</nowiki>''' | ||
{| | {| | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
Line 253: | Line 252: | ||
print header, # create HTTP header | print header, # create HTTP header | ||
start_html('Hello Page'); # start of HTML | start_html('Hello Page'); # start of HTML | ||
my $p1 = param( | my $p1 = param("part1"); # get first parameter | ||
my $p2 = param( | my $p2 = param("part2"); # get second parameter | ||
print h1($p1. | print h1($p1." ".$p2); # level 1 header | ||
print end_html; # end of HTML | print end_html; # end of HTML | ||
</pre> | |||
| | | | ||
& | | ||
|valign= | |valign="top"| | ||
<br>'''''Running the script''''' | |||
* Create a text file and copy the script. Save the file with name '''test_6.pl''' | * Create a text file and copy the script. Save the file with name '''test_6.pl''' | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: | * Type the following into a browser:<br> '''<nowiki>http://localhost/cgi-bin/test_6.pl?part1=Hello&part2=World</nowiki>''' | ||
|} | |} | ||
The query string '''?part1=Hello& | The query string '''?part1=Hello&part2=World''' contains two name/value pairs '''part1=Hello''' and '''part2=World'''. These values would normally be entered into a form using input tags and added to a URL when the page (form) is submitted. | ||
The script picks-up our two values using CGI function '''param( | The script picks-up our two values using CGI function '''param("input tag name")'''and assigns them to two variables '''$p1''' and '''£p2'''. The two variables (strings) are concatenated (joined together) and printed. | ||
'''''[[#top | Top]]''''' | '''''[[#top | Top]]''''' | ||
Line 277: | Line 276: | ||
{| | {| | ||
|- | |- | ||
|valign= | |valign="top"| | ||
<pre> | |||
#!/usr/bin/perl | #!/usr/bin/perl | ||
Line 284: | Line 283: | ||
use CGI qw/:standard/; # load standard CGI routines | use CGI qw/:standard/; # load standard CGI routines | ||
my $p1 = param( | my $p1 = param("part1"); # get parameter | ||
my $p2 = param( | my $p2 = param("part2"); # get parameter | ||
my $p3 = param( | my $p3 = param("part3"); # get parameter | ||
print header, # create HTTP header | print header, # create HTTP header | ||
start_html('Hello Page'), # start of HTML | start_html('Hello Page'), # start of HTML | ||
h1('Simple form'); # level h1 header | h1('Simple form'); # level h1 header | ||
if ($p1 & | if ($p1 && $p2 ){ # check both set | ||
print p('Full name = '.$p1. | print p('Full name = '.$p1." ".$p2); # print variables | ||
print p('Extra info = '.$p3); # print variable | print p('Extra info = '.$p3); # print variable | ||
} | } | ||
Line 297: | Line 296: | ||
print p('Enter First Name : ', textfield('part1','')); # add input tag | print p('Enter First Name : ', textfield('part1','')); # add input tag | ||
print p('Enter Last Name : ', textfield('part2','')); # add input tag | print p('Enter Last Name : ', textfield('part2','')); # add input tag | ||
print p('Extra:','& | print p('Extra:',' ' x 18 ,popup_menu('part3', # create dropdown menu | ||
['Hello World 1','Hello World 2','Hello World 3'])); # menu values | ['Hello World 1','Hello World 2','Hello World 3'])); # menu values | ||
print p(submit('Send')); # add submit button | print p(submit('Send')); # add submit button | ||
print end_form(),hr(); # end form | print end_form(),hr(); # end form | ||
print end_html; # end of HTML | print end_html; # end of HTML | ||
</pre> | |||
|} | |} | ||
'''''Running the script''''' | '''''Running the script''''' | ||
Line 308: | Line 307: | ||
* Copy this file to folder: '''UniServer\udrive\cgi-bin''' | * Copy this file to folder: '''UniServer\udrive\cgi-bin''' | ||
* Start the servers. | * Start the servers. | ||
* Type the following into a browser: ''' | * Type the following into a browser: '''<nowiki>http://localhost/cgi-bin/test_7.pl</nowiki>''' | ||
'''''[[#top | Top]]''''' | '''''[[#top | Top]]''''' | ||
Line 317: | Line 316: | ||
For example to run '''test_1.pl''' copy it to folder '''www''' type the following into your browser: | For example to run '''test_1.pl''' copy it to folder '''www''' type the following into your browser: | ||
''' | '''<nowiki>http://localhost/test_1.pl</nowiki>''' | ||
This is possible because cgi has been enabled in file '''.htaccess''' which is located in www. Open the file in a text editor you will find these two lines they have been un-commented (hash removed) hence enabled: | This is possible because cgi has been enabled in file '''.htaccess''' which is located in www. Open the file in a text editor you will find these two lines they have been un-commented (hash removed) hence enabled: | ||
<pre> | |||
AddHandler cgi-script .pl .cgi | AddHandler cgi-script .pl .cgi | ||
Options +ExecCGI | Options +ExecCGI | ||
</pre> | |||
The first line informs Apache files with the specified extension are to be processed as cgi scripts. | The first line informs Apache files with the specified extension are to be processed as cgi scripts. |