CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih...

34
CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang [email protected]
  • date post

    21-Dec-2015
  • Category

    Documents

  • view

    215
  • download

    2

Transcript of CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih...

Page 1: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

CS 898N – Advanced World Wide Web Technologies

Lecture 10: Examples of PERL and CGI

Chin-Chih [email protected]

Page 2: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts - An Example

• The Perl script of our example is fmail.pl.

#!/usr/bin/perl• All Perl scripts start with a line give the

location of the server’s Perl interpreter.

• You can run a Perl script in this way:

c:\perl\bin\perl signup.pl• The first thing we do is to declare variables.

Page 3: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

• There are no data types in Perl. Internally data is represented as numbers or strings.

• All numbers are double-precision floating-point. It means it is a 32-bit number.

• An array or string can be any size, up to the entire available memory.

Page 4: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

• Perl uses the first character to distinguish between types of variables: $ means a single number or string. @ means an array. # is the comment sign and is not a variable.

• The first line sets the value of $mailprog to “/bin/sendmail”.

$mailprog = ‘/bin/sendmail’;• The second line fills the array @months

with 12 string values.

Page 5: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

@months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);

• The third line calls a Perl function localtime and fills the arrary @tstamp with its values

@tstamp = localtime(time);• They are shown in the comment line

following as (second, minute, hour, day of month, year, day of week, day of year, and daylight savings time flag.

Page 6: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

#tstamp = ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst)

• The script then formats a string called $date as “dd-mmm-yy hh:mm” with the values from @tstamp.

$date = $tstamp[3] . "-" . $months[$tstamp[4]] . "-" . $tstamp[5];

$date .= " " . $tstamp[2] . ":" . $tstamp[1];

Page 7: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

• When referencing single array members the non-array $ is used, so instead of @tstamp[3], it is $tstamp[3].

• Array indexes start at 0.

• The “.” operator is the concatenation sign in Perl.

• The next statement reads the contents of the message sent by the post method, which is waiting in the stdin input buffer.

Page 8: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

• The read statement reads one line from the file named in the first parameter (STDIN) into the variable named in the second parameter ($buffer) up to the size named in the third parameter ($ENV{'CONTENT_LENGTH'}).

Page 9: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Declaring Variables

• CONTENT_LENGTH is an environment variable sent by the browser to the server through the HTTP header that delivers the CGI input.

• The next section is the Perl code that breaks down the CGI name/value pairs.

Page 10: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Regular Expressions

• The first action is to use Perl’s split function to blow apart the string at the “&” boundaries, storing the results in the array @pairs.

@pairs = split(/&/, $buffer);• “/&/” is a regular expression in Perl.

• A regular expression is a group of symbols that follows the rules of Perl.

Page 11: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Regular Expressions

• We have the expression between two slashes, and &.

• Regular expressions in Perl are used for pattern matching, where we create an expression that will match a set of characters in a character string.

• There is another regular expression below, as “%([a-fA-F0-9][a-fA-F0-9])”.

Page 12: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Regular Expressions

• This means the % sign followed by two elements: one instance of a character in any of the ranges a-f, A-F, or 0-9 followed by another instance of a character in the same ranges.

• This matches any instance of an encoded hexadecimal character in the format %nn.

Page 13: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Regular Expressions

• The statement with the split function takes the CGI string in $buffer and splits it up into several array elements using the & sign as the boundary between elements.

• The next block is a type of loop specific to Perl and is enclosed by a {} pair.

• The foreach statement steps through the array @pairs, assigning each value in turn to $pair.

Page 14: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Loops

foreach $pair (@pairs)• Notice that each statement must end with a

semicolon.• The beginning of the block does another

split, this time splitting each array element, which represents a name/value pair, on the = sign.

• The list ($name, $value) is assigned the results of the split.

Page 15: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Lists

($name, $value) = split (/=/, $pair);• There are two types of variables: scalar and

list.

• Scalar means a single value. $ variable is called a scalar variable and hold a single value.

• A list is ordered scalar data. @ variables are called array variables and hold lists.

Page 16: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Lists

• The ($name, $value) is a list. The expression (1, 2, 3) is a list literal. () is an empty list.

• After separating the name from the value and placing these in $name and $value, these pairs are still CGI encoded, so the next thing to do is to remove the special characters.

Page 17: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Removing Special Characters

• First we use the tr, or transliteration, function to replace each + sign with a space.

$value =~ tr/+/ /;• The =~ operator is called the substitution

operator that replaces the source variable (+) with its modified self ( ).

• Next, we use the search function (s) to take the encoded hexadecimal characters and replace them with their ASCII character values.

Page 18: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Removing Special Characters

• For instance translating “http%3A%2F%2F” back to “http://”.

• The replacement value uses an Perl function to pack, into a single character represented by “c”, the hex value of $1.

• $1 represents the match found by the first regular expression in the current statement.

• The g parameter at the end means search globally, replacing all values found in the entire string.

Page 19: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Removing Special Characters

• The e parameter means replace using the evaluated result of the replacement string (the character), not the literal value of what is in the replacement string (“pack(“c”, hex($1))”).

$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("c", hex($1))/ge;

Page 20: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts –Hash Arrays• Next, we use a hash array to store the

$name/$value pairs.• Arrays are accessed by their element

number starting with 0 (e.g., $names[0], $names[1], etc.).

• Hash arrays are given string key values and can be stored and retrieved using string keys (e.g. $surnames{“george”}).

• The hash array as a whole is referenced using the % sign.

Page 21: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts –Hash Arrays

• You would initialize a hash array using a list of the name/value pairs of the CGI scheme like this:

%cgiarray=(key1, value1, key2, value2, key3, value3)

• Like regular arrays, individual hash array elements are referenced using the $ sign, but unlike regular arrays, use the {} set for index reference.

Page 22: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts –Hash Arrays

$cgiarray{$name} = $value;• The next few statements in the script store

the name/value pairs in a hash array, and then use the push function to store them separately in two arrays: @names for the names and @values for values.

• push adds a value to the end of an array. pop takes the last array element and assign it to $last as in $last=pop(@array).

Page 23: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts –Hash Arrays• There is a good reason for using the separate

arrays to store the name/value pairs. We can randomly retrieve the %cigarray hash array values using string keys based on our CGI name parameters, but Perl decides how these are stored, which we have no control over. When we want to send the values back in the same order in which they come in, that won’t work.

push (@names, $name);push (@values, $value);

Page 24: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Errors Handling

• There is a test to see that there is somewhere to send the e-mail. This prevents us from crashing the mail program with no recipient.

• If there is none, a subroutine call to &safe_die is issued to display an error message.

• In Perl, the & symbol prefixes the name of a subroutine.

Page 25: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Errors Handling• The safe_die subroutine displays an

HTML header line followed by the contents of @_, which contains an array of parameters; in this case, one or more error messages passed to the subroutine.

$target = $cgiarray{'recipient'};if ($target eq "") { &safe_die("No Recipient Given!\n"); }

Page 26: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Errors Handling

• After this recipient handling, we check to see if the sender’s e-mail address was entered, and if not, replace that with a dummy address to satisfy the requirements of the sendmail program.

if ($cgiarray{'username'} eq "") {

$cgiarray{'username'} = "No-Email-Given\@nowhere.none";

}

Page 27: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Errors Handling• The word die in Perl means to end the

program.• The primary type of error is a syntax error

that will be found when you first run the script. There’s very little that can crash a Perl Program.

sub safe_die { print "Content-type: text/plain\n\n"; print @_,"\n"; exit(0);}

Page 28: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• First we open a file. STDIN and STDOUT are the defaults.

• STDIN comes from either the keyboard for Perl to run at the command prompt, or the CGI string for server-side Perl.

• STDOUT goes to the display for command prompt Perl or the user agent for server-side Perl.

Page 29: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• In this example, we are opening a file and calling it MAIL. This is called a file handle.

• We are opening a pipe to $mailprog, declared at the start of the script as “/bin/sendmail”.

• The –t flag tells sendmail to read the recipient addresses from the lines labeled “To:” and “Cc:”.

Page 30: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• The | pipe symbol means we want the output directed to the MAIL file handle to go to the input of the sendmail program, we don’t want to create a file called sendmail.

• To open a file for input, use the < symbol, and for output, use the > symbol.

• There is an or (||) symbol between the open statement and die subroutine call.

Page 31: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• The result of the open statement is logically evaluated: If true, the second half is not executed; otherwise, it is.

open (MAIL, "|$mailprog -t") || die("Can't open $mailprog!\n");

• Notice we that we are using variable names in the middle of strings. Perl calls this variable interpolation.

Page 32: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• We can use a ‘single-quoted string’, which will not be interpolated.

• The print statements writes the string to MAIL.

print MAIL "From: $cgiarray{'username'}\n";print MAIL "Reply-To: $cgiarray('username'}\n";print MAIL "To: $cgiarray('recipient')\n";print MAIL "Subject: $cgiarray{'subject'}\n\n";print MAIL "Information submitted on $date\n";

Page 33: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• The name/value printing loop run through the values stored in the matched $name and $value arrays.

• The variable $#array contains the size of the array.

for ($i=0; $i<=$#names; $i++) { print MAIL "$names[$i]: $values[$i]\n";}

Page 34: CS 898N – Advanced World Wide Web Technologies Lecture 10: Examples of PERL and CGI Chin-Chih Chang chang@cs.twsu.edu.

Perl Scripts – Sending Mail with Perl

• Once this is done, the MAIL file is closed.

close (MAIL);• The last thing is to transfer the browser

location to a page that says, “Thanks for your order.”

• There is no file named in the print statement, so the default goes to STDOUT, which ends up back at the user agent.

print "Location: $cgiarray{'thankurl'}\n\n";