Date post: | 20-Dec-2015 |
Category: |
Documents |
View: | 215 times |
Download: | 0 times |
Introduction to Perl
Lecturer: Prof. Andrzej (AJ) BieszczadEmail: [email protected]
Phone: 818-677-4954
“UNIX for Programmers and Users”Third Edition, Prentice-Hall, GRAHAM GLASS, KING ABLES
Slides partially adapted from Kumoh National University of Technology (Korea) and NYU
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 2
What is Perl?• Practical Extraction and Report Language
• Written in 1986 by Larry Wall
• Influenced from awk, sed, and C Shell
• Similar to ksh93, python, tcl, javascript
• Widely used for CGI scripting
• Freely available
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 3
Running Perl in UNIX• Explicit invocation of a program
$ perl [options] program [arguments]
• Using the #! Directive in program
$ program [arguments]
• Command line expression
$ perl –e ’print ”hello\n”;’
• Debugging mode (opens a CLI debugger - similar to gdb, dbx, jdb, etc.)
$ perl -d program [args]
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 4
Perl Example
#!/usr/bin/perl -w # THIS IS A COMMENT: -w issues warningsprint “What is your favorite color? “;$color = <STDIN>;chomp($color);if ($color eq ‘blue’){print “That is my favorite! \n”;
}elsif ($color =~ /black/){print “ I do like $color for my shoes\n”;
}else{print “$color is a nice choice \n”;
}
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 5
Data Types• Basic data types: scalars, indexed arrays of scalars (lists), and associative arrays.
• Scalars are strings or numbers depending on context.
• Type of variable determined by special leading character:
$ scalar@ indexed array% associative array& function
• All data types have separate name spaces
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 6
Data Types Examples• Scalars:
$str = “The world is round” ; # string variable$num = 134.99; # numeric variable
• Arrays
@students =(“Mike”, “Lisa”, “John”);print $students[0]; # print Mike$students[3]= “Julie”; # add a new element$size = @students; # size of the array (== 4)@students = (); # empty array
• Hashes
%emp =(“Julie”, “President”, “Mary”, “VP”);print $emp {“Julie”}; # print “President”$emp{“John”} = “controller”; # add an element
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 7
Special Scalar VariablesImportant special variable:
$_ default pattern for operators
Plenty fo other variable:
$0 name of the currently running script
$$ the current PID
$? status of last pipe or system call
$. the current line number of last input
$] the version of perl being used
$< the real uid of the process
$> the effective uid of the process
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 8
Special Array Variables@ARGV command line arguments
@INC search path for modules
@_ default for split and subroutine parameters
%ENV current environment
%SIG used to set signal handlers
sub trapped {print STDERR “Interrupted!\n”;exit 1;
}$SIG{’INT’} = ’trapped’;
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 9
Operators• Perl uses all of C’s operators (except type casting and pointer operators), and adds:
• exponentiation: **, **=
• range operator: ..
@new = @old[30..50];print 1 .. 9;
• string concatenation: . , .=
$x = $y . &frob(@list) . $z;$x .= ”\n”;
• string repetitor operator: x
“fred” x 3 # is fredfredfred
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 10
Numeric and String comparison operators
Comparison Numeric String
equal == eq
not equal != ne
less than < lt
greater than > gt
less than or equal to <= le
greater than or equal to >= ge
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 11
Flow Control• Unlike C, blocks always require braces
• unless and until are just if and while negated
if (EXPR) BLOCK else BLOCK
if (EXPR) BLOCK elsif (EXPR) BLOCK else BLOCK
while (EXPR) BLOCK
do BLOCK while EXPR
for (EXPR; EXPR; EXPR) BLOCK
foreach $VAR (LIST) BLOCK
• For readability, if, unless, while and until may be used as trailing statement modifiers:
return –1 unless $x > 0;&myfunction or die
• Uses next and last rather than C’s continue and break. Also contains redo to repeat loop iteration
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 12
Flow Control Examples# print an arrayfor ($i = 0; $i < @myarray; $i++) { # @myarray is the number of elements print “$myarray[$i]\n”;}
# print all element of an array until the one that is negativeforeach $element (@myarray) { last if $element < 0; print “$element\n”;}
# check if password file existsif (-f /etc/passwd) { print “file exists\n”}
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 13
Flow Control Examples # reverse foo$n = @foo; for ($i=0; $i < $n/2; $i++) {
$temp = $foo[$i];$foo[$i] = $foo[$n-1-$i];$foo[$n-1-$i] = $temp;
}
# find power of 2 larger than a numberprint "Enter a number: ";$num = <STDIN>;$power = 1;$power *=2 until ($power >= $num);print "next power of 2 is $power\n";
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 14
Another Flow Control Example# ask for a non-empty name{ print("What is your name? "); $name = <STDIN>; chop($name);
if (! length($name)) { print("Please try again\n"); redo; }
print("Thank you, " . uc($name) . "\n");}
do { print("What is your name? "); $name = <STDIN>; chomp($name);
if (! length($name)) { print("Please try again\n"); }
} until (length($name));
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 15
Regular Expressions• Understands egrep-style EREs, plus:
\w, \W alphanumerics and _\d, \D digits\s, \S whitespace\b, \B word boundaries\t tab
• Special variables: $& means all text matched, $` (back quote) is text before match, $’ (single quote) text after
• Use \1 .. \9 within EREs, $1 .. $9 outside
if (/^this (red|blue|green) (bat|ball) is \1/){ ($color, $object) = ($1, $2); }
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 16
Regular ExpressionsSubstitute and translation operators are like sed:
s/alpha/beta/; # alpha --> beta in special variable $_
s/(.)\1/$1/g; # (blah) --> blah in special variable $_
y/A-Z/a-z/; # upper case --> lower case# in special variable $_
• Use =~ and !~ to match against variables
$var1 =~ s/pattern/replacement/; # substitute in $var1
if ($var =~ /pattern/) {...} # if $var has the pattern
if (<STDIN> =~ /^[xX]/) { ... } # if STDIN starts with X or x
if ($var !~ /pattern/) { ... } # if $var does not have a pattern
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 17
The Variable $_
• $_ is used a lot in Perl
• When variable is left out, $_ is used:
• Example:
foreach (@list) {... $_ ...} # points to “each”
s/good/bad/; # in whatever $_ is
if (/pattern/) {…} # if $_ matches “pattern”
if (!/pattern/) {…} # if $_ does not match “pattern”
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 18
I/O• Filehandles conventionally uppercase: STDIN, STDOUT, STDERR
• Mentioning a filehandle in angle brackets (<…>) reads next line:
• scalar context: returns line (with newline)
$line = <TEMP>;
• array context: returns all lines (with newlines)
@lines = <TEMP>;
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 19
I/O continued
• When used in a while construct, input lines are automatically assigned to the $_ variable.
• Typical usage: iterate over file one line at a time, using $_
while ( <> ) {next if /^#/; # continue - skip comments == if line starts with #last if /STOP/; # break - stop if a line with “STOP” reads/left/right/g; # global substitute: left --> rightprint; # print $_
}
• <> means all files supplied on command line (or STDIN if none) put together
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 20
Files• Opening a file
open(PWD, ”/etc/passwd”);open(TMP, ”>/tmp/foobar.$$”);open(LOG, ”>>logfile”);open(TOPIPE, ”| lpr”);open(FROMPIPE, ”ps –ef |”);open(PWD, ”/etc/passwd”) or die ”cannot open”;
• Printing:
print LOG ”This is a log entry\n”;printf LOG ”entry: %s\n”, $var
• awk influence
$, field separator (column delimiter)$/ record separator (line delimiter)
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 21
I/O Example# Read an array from a file$buffer = "";
open(FILE, "<binary.dat");read(FILE, $buffer, 20, 0);close(FILE);
# print the value of all array elements in hexadecimal format.
foreach (split(//, $buffer)) { # split into characters printf("%02x ", ord($_)); print "\n" if $_ eq "\n";}
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 22
Globbing
• Perl has globbing, similar to shell
• A string in angle brackets with metacharacters evaluates to a list of matching filenames
# change all *.c and *.h files to *.c.old and *.h.oldforeach $x ( <*.[ch]> ) {rename($x, “$x.old”);
}
chmod 711, <*.c>;
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 23
Subroutines• Defined with sub:
sub myfunc { ... }
• Subroutines calls are prefaced with &. Any of the three principal data types may be passed as parameters or used as a return value; e.g.,
&foo;
• Special variable $_ passed by default
• Parameters are received by the subroutines in the special array @_:
$_[0], $_[1], ...
• Local variables can be declared with my
• By default, $_ returned. Override with return statement
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 24
Subroutine Examples&foo; # call subroutine foo with $_
&foo(@list); # call foo passing an array$x = &foo(‘red’, 3, @arr); # foo returns a value that is assigned to x
@list = &foo; # foo returns a list
sub simple {my $sum; # local variableforeach $_ (@_) { # @_ is the list of parameters
$sum += $_;}
return $sum;}
$foo = ‘myroutine’;&$foo(@list); # call subroutine indirectly
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 25
Array Functions• push and pop functions:
– when arrays are used a stack of information, where new values are added to and removed from the right hand side of the list.
• Example:
push(@mylist, $newvalue); # like: @mylist = (@mylist, $newvalue);
$oldvalue = pop(@mylist); # removes last element of my list.
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 26
Array Functions (cont.)• shift and unshift functions:
– performs similar action to push and pop on the "left" side of a list.
• Example:
@fred = (5, 6, 7);unshift(@fred, $a) ; # like @fred = ($a, @fred);$x = shift(@fred); # x gets 5, @fred is now (6, 7)
• reverse function:– reverses the order of the elements of its argument, returning the resulting list
@a = (1, 2, 3);@b = reverse(@a); # means @b = (3, 2, 1);
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 27
Array Functions (cont.)• sort function:
– returns a sorted list in ascending ASCII order without changing original list
• grep function:– returns a new list consisting of all the elements which match the given expression
@lines = grep(!/^#/, @lines);
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 28
Array functions (cont.)•split
– breaks up a string into an array of new strings. You can split on arbitrary regular expressions:
@list = split(/[, \t]+/, $expr); # use any number of “,”, “ “ or “\t” to separate
while (<PASSWD>) { # use “:” to split lines in the PASWD file($login, $passwd, $uid, $gid, $gcos, $home, $shell) = split(/:/);
}
• The inverse of split is join
$line = join(‘:’, $login, $passwd, $uid, $gid, $gcos, $home, $shell);
• pattern “//” will split into single characters
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 29
Directory Access• Method 1:
• Open a pipe from /bin/ls:
open(FILES, “/bin/ls *.c |”);
• Method 2:
• The directory-reading routines are provided as built-ins and operate on directory handles. Supported routines are opendir, readdir, closedir, etc.
opendir(DIR, ".");@files = sort(grep(/pl$/, readdir(DIR))); # extract only those that end in plclosedir(DIR);
foreach (@files) { print("$_\n") unless -d; # print name unless the file is a directory}
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 30
Hash Table Functions• For manipulating associative (hash) arrays, the following functions are useful:
• keys: returns indexed array of keys
• values: returns indexed array of values
• each: returns indexed array of two-element arrays containing ($key,$value) pairs.
while (($key, $value) = each %array) { printf “%s is %s\n”, $key, $value;}
foreach $key (keys %array) { printf “%s is %s\n”, $key, $array{$key};}
print reverse sort values %array;
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 31
String functions• Several C string manipulation functions:
– crypt, index, rindex, length, substr, sprintf
• Adds others:– chop: removes the last character from a string (very useful for removing \n character)– chomp: removes last character only if \n– work with scalars or arrays
chop($line)
while (<STDIN>) {chomp;...
}
@stuff = (“hello\n”, “hi\n”, “ola\n”);chomp(@stuff);
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 32
Example Program#!/usr/bin/perl# Print out today’s yearday on stdout
($sec,$min,$hour,$day,$mon,$year,@rest) = gmtime();
@months = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if ($year == 2000) { # A leap year $months[1] = 29;}$yearday = 0;for ($m=0; $m < $mon; $m++) { $yearday += $months[$m];}$yearday += $day;print $yearday . “\n”;
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 33
awk and sed Connection• a2p
– Translates an awk program to Perl
• s2p– Translates a sed script to Perl
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 34
Perl can get messy…
Write your own munitions…
#!/bin/perl -s-- -export-a-crypto-system-sig -RSA-3-lines-PERL$m=unpack(H.$w,$m."\0"x$w),$_=`echo "16do$w 2+4Oi0$d*-^1[d2%Sa2/d0<X+d*La1=z\U$n%0]SX$k"[$m*]\EszlXx++p|dc`,s/^.|\W//g,printpack('H*',$_)while read(STDIN,$m,($w=2*$d-1+length$n&~1)/2)
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 35
Packages (Modules)• A collection of functions
– Usually stored in a file called MyModule.pm
• Each has its own namespace– Access with: $MyModule::Variable– Default package is $main
• To use a package: use MyModule;
• To create a module:– Start off with: package MyModule;– Definitions of subroutines and variables– Export routines/variables to global namespace– Indicate success with line:
1; #last statement in file
• Many available packages:– e.g., CGI
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 36
Perl as a CGI scripting language• CGI - Common Gateway Interface
– allows for embedding actions on Web pages
– Java Servlet - same idea, but needs a Java Application Server (J2EE)– Microsoft has .Net
Web Browser Web Browser
html
Web Browser Web Server
cgi CGI Engine
html
e.g., Perl program e.g., Perl interpreter
Simple file serving
Similarly, .txt, .jpg, .pdf, etc.
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 37
cgi.pm• Perl module for CGI parsing (Perl 5 and newer)
– Also includes utility functions for generating HTML, debugging, etc.
$ cat birthday.cgi#!/usr/bin/perluse CGI;$query = CGI::new();$bday = $query->param("birthday");print "Content-type: text/html\n\n";print "Your birthday is $bday <br>\n";$ chmod 755 birthday.cgi$ birthday.cgi birthday=11/5/02 # pass the parametersContent-type: text/html
Your birthday is 11/5/02
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 38
CGI Script: Example
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 39
Part 1: HTML Form<html><center><H1>Anonymous Comment Submission</H1></center>Please enter your comment below which willbe sent anonymously to me.<p><form action=cgi-bin/comment.cgi method=post><textarea name=comment rows=20 cols=80></textarea><input type=submit value="Submit Comment"></form></html>
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 40
Part 2: CGI Script (Perl)#!/usr/bin/perl
use CGI;$query = new CGI;
$comment = $query->param('comment');$recipient = '[email protected]';$sendmail = '/usr/sbin/sendmail';
open(MAIL, "|$sendmail -oi -t") or die "Can't open pipe to $sendmail: $!\n";print MAIL "To: $recipient\n";print MAIL "Subject: Sample Web Form Submission\n\n";print MAIL "$mail_body";close(MAIL) or die "Can't close pipe to $sendmail: $!\n";
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 41
Part 2: CGI Script (Perl)
print "Content-type: text/html\n\n";print <<"EOF"; # print everything literally until the text<HTML><HEAD><TITLE>Thank you</TITLE></HEAD><BODY><H1>You submitted the following comment:</H1><pre>EOF # end of the first printprint $comment . "\n";print <<"EOF";</pre><H1>Thank you</H1><P>Thank you for your form submission.</BODY></HTML>EOF
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 42
CGI environmentLogin to HP servers and do the following:
$ mkdir public_html$ cd public_html$ vi page.html # enter the HTML file$ chmod 644 page.html$ mkdir cgi-bin$ cd cgi-bin$ vi script.cgi # enter the CGI script (Perl program)$ chmod 755 script.cgi
Then open a browser and go to http://www.csun.edu/~yourname/page.html
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 43
Another Example#!/usr/bin/perl# Dump parameters and environment variables
use CGI;
$query = CGI::new;print &CGI::header;
print "<H1> Date </H1>\n";print "<pre>\n";print `date\n`;print "</pre>\n";
print "<H1> Form Variables </H1>\n";print "<pre>\n";foreach $p (sort(($query->param))) { print "$p = " . $query->param($p) . "\n";}print "</pre>\n";
print "<H1> Environment </H1>\n";print "<pre>\n";foreach $p (sort((keys ENV))) { print "$p=" . $ENV{$p} . "\n";}print "</pre>\n";
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 44
Another Example with Database Access<html><head><title>User Database Access Test - perl</title></head><body><h1>User Database Access Test - perl</h1><p><form action="http://www.some.com/userData.cgi" method=post>A simple example to find information about a user data.<br>Enter your user ID name<input type=text name=“ID”><br><input type=submit value="Search database"></form><p></body></html>
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 45
Another Example with Database Access#!/usr/local/bin/perluse CGI;# DBI is a module with a database connectoruse DBI;
$query = new CGI;# a debugging option that sends error messages to the browser rather# than log fileuse CGI::Carp qw(fatalsToBrowser);# print page headerprint "Content-type: text/html\n\n";print "<html><head><title>Location query</title></head>";print "<body><h1>Location query</h1><p>";# connect to the database “userDatabase” with ID “demo” and password “”$dbConnector = DBI->connect("dbi:mysql:userDatabase","demo","")
or die("Couldn't connect");# import names from the query page into a namespace ‘MySpace’$query->import_names(’MySpace');# prepare a database query$sqlTable = $dbConnector->prepare("select * from placeDatabase where feature = ?")
or die("Couldn't prepare");
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 46
Another Example with Database Access# execute the query replacing ‘?’ with $MySpace::ID$sqlTable->execute($MySpace::ID);# are there any rows in the table?if($sqlTable->rows == 0){ print "No information for " . $MySpace::ID;}else{ print "<table border=2>\n";# get the row and put it into an associative array (a hash) while( $rowHash = $sqlTable->fetchrow_hashref() ) { print "<tr>"; print "<td>" . $rowHash->{”name”}; print "<td>" . $rowHash->{”address"}; print "<td>" . $rowHash- >{”telephone"}; print "<td>" . $rowHash- >{”email"}; print "\n"; } print "</table>\n";}print "</body></html>\n";# disconnect from the database$dbConnector->disconnect;
Ch. 2. UNIX for Non-Programmers
Perl Challenge
Introduction to Perl
Prof. Andrzej (AJ) Bieszczad Email: [email protected] Phone: 818-677-4954 48
Homework/Project• Read the CGI/Perl tutorials (see my links) - start with the “beginners”
• Implement the following Web-based pizza ordering system:
• You should have forms for:– delivery address– some selection for pizza (ingredients, style, etc.)– credit card information and– email address for confirmation.
• You do not need to store the data.
• You do not need to verify and charge credit card.
• The data collected from the form should be sent to your email address.
• A confirmation with order details should be displayed on the new page.
• You’ve got 3 weeks! I need the link to try out your program and your HTML file and CGI script.