Mark Bixby csy r&d lab august 21, 2001 perl programming on mpe/ix August 21, 2001 HP World Page 1
introduction and history • Practical Extraction and Report Language • Pathologically Eclectic Rubbish Lister? • the Swiss Army chainsaw of scripting languages • optimized for text processing • combines the best of C, sh, awk, and sed • released in 1987 by Larry Wall • initially ported to MPE by Mark Klein • re-ported by Mark Bixby in 1997 with periodic updates since then • "There's more than one way to do it!" August 21, 2001 HP World Page 2
current status • Perl release v5.6.0 available for MPE from bixby.org • Perl release v5.6.1 available for MPE from jazz.external.hp.
installation • download from http://jazz.external.hp.
how to execute the interpreter • From the shell: /PERL/PUB/perl [optional parameters] • As a shell script: #!/PERL/PUB/perl [optional parameters] • From the CI: :XEQ SH.HPBIN.
variable names • scalar values • $days # the simple scalar value "days" • $days[28] # the 29th element of array @days • $days{'Feb'} # the 'Feb' value from hash %days • $#days # the last index of array @days • entire arrays or array slices (aka lists) • @days # ($days[0], $days[1],... $days[n]) • @days[3,4,5] # same as @days[3..5] • @days{'a','c'} # same as ($days{'a'},$days{'c'}) • entire hashes • %days August 21, 2001 # (key1, val1, key2, val2 ...
value constructors • scalar values • $abc = 12345; • $abc = 12345.
scalar vs.
simple statements • terminated with a semicolon • may be followed by one optional modifier • if EXPR • unless EXPR • while EXPR • until EXPR • foreach EXPR • $os = 'mpe'; • $os = 'mpe' if $model == 3000; August 21, 2001 HP World Page 9
compound statements • a block is a sequence of statements delimited by curly brackets (braces) that defines a scope • compound statements that control flow: • if (EXPR) BLOCK • if (EXPR) BLOCK else BLOCK • if (EXPR) BLOCK elsif (EXPR) BLOCK ...
subroutines sub max { my $max = shift(@_); foreach $foo (@_) { $max = $foo if $max < $foo; } return $max; } $bestday = max($mon,$tue,$wed,$thu,$fri); • parameters passed via @_ array • @_[0] = parm1, @_[1] = parm2, etc • @_ is an alias (i.e.
arithmetic operators • addition: + • subtraction: • multiplication: * • division: / • modulus: % • exponentiation: ** • auto-increment and -decrement: ++ -• ++$a - increments $a, returns new value • $a++ - returns current value, then increments $a August 21, 2001 HP World Page 12
assignment operators • works like C • $a += 2; is equivalent to $a = $a + 2; • **= += *= &= <<= &&= -= • |= >>= ||= .
relational operators • numeric comparisons: •< > <= >= == != <=> • <=> returns -1, 0, or 1 depending on whether the left argument is numerically less than, equal to, or greater than the right argument • string comparsions: • lt gt le ge eq ne cmp • cmp returns -1, 0, or 1 depending on whether the left argument is stringwise less than, equal to, or greater than the right argument August 21, 2001 HP World Page 14
bitwise operators • shift left: << • shift right: >> • AND: & • OR: | • XOR: ^ • negation: ~ August 21, 2001 HP World Page 15
i/o and file handles • open files are identified via file handles • uppercase handle names by convention • predefined file handles: STDIN, STDOUT, STDERR • in a scalar context reads the next record from the file • in a list context reads ALL of the remaining records from the file • filenames must be specified using POSIX HFS syntax instead of MPE syntax August 21, 2001 HP World Page 16
opening files with open() • open(HANDLE, "/path/to/file") # open for reading • open(HANDLE, "< /path/to/file") # open for reading • open(HANDLE, "> /path/to/file") # open for writing • open(HANDLE, ">> /path/to/file") # open for appending • open(HANDLE, "| shell command") # open pipe for writing • open(HANDLE, "shell command |") # open pipe for reading • Be very careful when passing user data to open() as a file name! Hackers know to try using the special metacharacters listed above.
a file i/o example #!/PERL/PUB/perl open(HPSW, "/SYS/PUB/HPSWINFO"); # open for input $one = ; # read first line $two = ; # read second line $three = ; # read third line @therest = ; # read all remaining lines close(HPSW); # close the file open(PATCHES, "> /tmp/MPE.
regular expressions • a vast superset beyond standard Unix regexps • a ? modifier to make patterns non-greedy • zero-width lookahead and lookbehind assertions • conditional expressions • extra character class matches: • \w - match a "word" character (alphanumeric, "_") • \W - match a non-word character • \s - match a whitespace character • \S - match a non-whitespace character • \d - match a digit • \D - match a non-digit • http://www.perl.com/pub/doc/manual/html/pod/perlre.
using regular expressions $showme=`callci showme`; if ($showme =~ /RELEASE: ([A-Z]\.(\d)(\d)\.\d\d)/) { $release = $1; # the matching V.UU.FF $mpe = "$2.$3"; # the matching U and U (i.e. 7.
predefined variables - a partial list • $| or $OUTPUT_AUTOFLUSH • By default, all Perl output is buffered (0). To enable automatic flushing, set this variable to 1. Needed when doing MPE I/O which is usually unbuffered.
built-in functions - a partial list • Functions for SCALARs or strings • chomp, chop, chr, crypt, hex, index, lc, lcfirst, length, oct, ord, pack, q/STRING/, qq/STRING/, reverse, rindex, sprintf, substr, tr///, uc, ucfirst, y/// • Regular expressions and pattern matching • m//, pos, quotemeta, s///, split, study, qr// • Numeric functions • abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand • Functions for real @ARRAYs • pop, push, shift, splice, unshift • Functions for list data • grep, jo
built-in functions (cont.
built-in functions (cont.
object oriented programming • an object consists of: • attributes (data) • methods (functions to manipulate the attributes) • many CPAN modules are object-oriented • for more info: • http://www.perl.com/pub/2000/12/begperl5.html • http://www.perl.com/pub/doc/manual/html/pod/perltoot.
object definitions example - Foo.
object usage example #!/PERL/PUB/perl use Foo; # refers to Foo.
interprocess communications • POSIX signals between related processes • named pipes between unrelated processes • create named pipes with POSIX mkfifo command • unnamed pipes to child processes • create using Perl open() function with "|" • Internet-domain TCP and UDP sockets • Unix-domain stream sockets • SysV IPC - shared memory, semaphores, messages August 21, 2001 HP World Page 28
sockets - a procedural client example #!/PERL/PUB/perl -w use Socket; $proto = getprotobyname('tcp'); # get protocol number $ipaddr = inet_aton('localhost'); # get the host's IP address $port = getservbyname('daytime', 'tcp'); # get port number $address = sockaddr_in($port, $ipaddr); # create addr struct socket(SOCK, PF_INET, SOCK_STREAM, $proto); # create the socket connect(SOCK, $address); # connect to remote host $timestamp = ; print "$timestamp\n"; close(SOCK); August 21, 2001 # read a line of d
sockets - an object-oriented client example #!/PERL/PUB/perl -w use IO::Socket; # create the socket and connect to the host $remote = IO::Socket::INET->new( Proto = 'tcp', PeerAddr = 'localhost', PeerPort = 'daytime'); $timestamp = <$remote>; print "$timestamp\n"; close($remote); August 21, 2001 # read a line of data from the socket # print the results # close the socket HP World Page 30
web server cgi - a simple example use CGI qw(:standard); print header; print start_html('A Simple Example'), h1('A Simple Example'), start_form, "What's your name? ",textfield('name'), p, "What's the combination?", p, checkbox_group(-name=>'words', -values=>['eenie','meenie','minie','moe'], -defaults=>['eenie','minie']), p, "What's your favorite color? ", popup_menu(-name=>'color', -values=>['red','green','blue','chartreuse']), p, submit, end_form, hr; August 21, 2001 HP World Page 31
web server cgi - a simple example (cont.) if (param()) { print "Your name is ",em(param('name')), p, "The keywords are: ",em(join(", ",param('words'))), p, "Your favorite color is ",em(param('color')), hr; } print end_html; • http://stein.cshl.
mpe as a web client • it's now possible to write MPE applications that look like web browsers • perform simple HTTP GET requests, or even complicated HTTP POST requests to fill out remote web forms #!/PERL/PUB/perl use LWP::Simple; # read the web page contents into the scalar variable $webpage $webpage = get('http://www.bixby.org/mark/perlix.html'); • See http://www.linpro.
debugging • invoke the debugger by starting Perl with the -d parameter • #!/PERL/PUB/perl -d • examine or modify variables • single-step execution • set breakpoints • list source code • set actions to be done before a line is executed • a 53 print "DB FOUND $foo\n" • debugger terminal I/O may act a bit strangely on MPE August 21, 2001 HP World Page 34
perl extensions • binary code residing in an external NMXL loaded at run time • a thin layer of C that allows the Perl interpreter to call compiled code written in other languages • several extension libraries come bundled with Perl (sockets, POSIX, etc) • a decent tutorial is available - the examples even work on MPE! • http://www.perl.com/pub/doc/manual/html/pod/perlxstut.
comprehensive perl archive network (cpan) • http://www.cpan.org/ • a vast collection of free Perl modules • over 2200 modules and 850 megabytes of cool stuff • mirrored at more than 100 sites around the world • typical installation process for a CPAN module: • perl Makefile.
integration with mpe • for access to MPE commands: • system("callci mpe_command") • `callci mpe_command` • integration with Apache via mod_perl available from • http://www.bixby.org/mark/apacheix.html (unsupported freeware) • TurboIMAGE intrinsic functionality available from http://www.cpan.org/modules/by-authors/Ted_Ashton/ • CI command, JCW, and variable intrinsic functionality available from http://invent3k.external.hp.com/~MGR.
perl resources • http://www.perl.com/ - the starting point for all things Perl • http://perl.oreilly.com/news/success_stories.html - how Perl is being used in real-life situations • http://www.perl.com/pub/2000/10/begperl1.html - Beginner's Introduction to Perl • http://perl.apache.org/ - The Apache/Perl Integration Project • http://jazz.external.hp.com/src/hp_freeware/perl - for the latest info about Perl on MPE • Usenet newsgroups comp.lang.perl.
join the hp3000-L community! • Available as a mailing list and as the Usenet newsgroup comp.sys.hp.mpe • In-depth discussions of all things HP e3000 • Talk with other people using Perl on MPE • seek advice, exchange tips & techniques • Keep up with the latest HP e3000 news • Interact with CSY • http://jazz.external.hp.com/papers/hp3000-info.