210 likes | 325 Views
Perl. CISC/QCSE 810. Dirty Secret. In computation-based science, a shockingly large number of person-hours are spent on bookkeeping Common worries: have I run all the data through the filter? have I run all four algorithms on my new test case?
E N D
Perl CISC/QCSE 810
Dirty Secret • In computation-based science, a shockingly large number of person-hours are spent on bookkeeping • Common worries: • have I run all the data through the filter? • have I run all four algorithms on my new test case? • in the graph in my paper generated using the latest optimization algorithm, or the one before? • how can I track the progress of this data through pre-processing, search, filtering, and graphing? • Modularity is most effective when combined with automation
History of Perl In the mid 1980's, Larry Wall was working as a sysadmin and found that he needed to do a number of common, yet oddball functions over and over again. And he didn't like any of the scripting languages that were around at the time, so he invented Perl. Version 1 was released circa 1987. A few changes have occurred between then and now. The current version of Perl has exceeded 5.8.0 and is a highly recommended upgrade.
What Is Perl? • Practical Extraction and Report Language • Originally focused on text parsing, input and output • Since has generalized to a "glue" language, as well as having libraries dedicated to particular scientific and computer science areas
Where is it used? • Anywhere you parse or manipulate text • Web servers (CGI scripts) • Database access and processing • Anywhere you want to automate file handling and organization • Generally not the first choice for numeric calculations • not compiled, not type-safe
Type of Language • Semi-interpreted • Uses byte-code representation like Java • Doesn't store byte code for later re-use • In desktop usage, most like BASIC • write program, then run it • Advantages – no compiling, no makefiles • Disadvantages – can be slower running, not type-safe, can encourage poor style
Example #!/usr/bin/perl -w if (@ARGV != 1) { die "Usage: prog1 <filename>\n"; } $filename = shift @ARGV; open(FILE, $filename) or die "Unable to open $filename\n"; %word_count = (); while ($line = <FILE>) { chomp $line; @words = split('\s+', $line); foreach $word (@words) { $word_count{$word} += 1; } } close(FILE);
Example continued # *** Print words in alphabetic order *** foreach $word (sort (keys(%word_count))) { print "$word: " . $word_count{$word} . "\n"; } # *** Print words in descending count order *** sub hashValueDescendingNum { $word_count{$b} <=> $word_count{$a}; } print ("-" x 80) . "\n"; @sorted_words = sort hashValueDescendingNum keys(%word_count); foreach $word (@sorted_words) { print "$word: " . $word_count{$word} . "\n"; }
Basic Datatypes • Scalar --- $ • any single value • can (and often is) converted at will between integer, double, string • Array --- @ • an array of scalars • Hash --- % • like the STL map, an easy way to construct fast lookup tables
Perl as File Walker #!/usr/bin/perl -w @ppt_files = <*.ppt>; print "PPT files in the directory are ". join(", ", @ppt_files) . "\n"; @all_files = <*>; foreach $file (@all_files) { if (-f $file) { print "file: $file\n"; } elsif (-d $file) { print "dir: $file\n"; } }
Ways to access shell • Backticks • $response = `<command>` • system • system("<command>") • exec • exec("<command>")
Example #!/usr/bin/perl -w @all_files = <*>; FILE: foreach $file (@all_files) { if (! -f $file) { next FILE; } $wc_resp = `wc -l $file`; chomp $wc_resp; @wc_resp_arr = split /\s+/, $wc_resp; $lines_in_file = $wc_resp_arr[0]; print "$file: $lines_in_file lines\n"; }
Perl as a Web Browser • with LWP Perl library, Perl can • act as a web browser • download web pages • identify and follow links • download non-HTML files
Web Browser Example # Create a user agent object use LWP::UserAgent; $ua = LWP::UserAgent->new; $ua->agent("MyApp/0.1 "); # Create a request my $req = HTTP::Request->new(POST => 'http://search.cpan.org/search'); $req->content_type('application/x-www-form-urlencoded'); $req->content('query=libwww-perl&mode=dist'); # Pass request to the user agent and get a response back my $res = $ua->request($req); # Check the outcome of the response if ($res->is_success) { print $res->content; } else { print $res->status_line, "\n"; }
Perl as a Controller • Perl can communicate via ports • can set supervisor running on one computer • can set delegates running on set of others • delegates can talk to server, get run parameters, execute code, and report back • automates algorithms with "embarassing parallelism"
Personal and Professional Uses • Automated the uploading of slides, via perl FTP package • Downloaded all the web-based version of a textbook to a local copy • Batch run data analysis across multiple machines • Manage process of updating graphs of research results • Load TA assignments from a flat file into a database, using DBD package • Generate HTML reports from database • Check directories for redundant files
Perl isn't unique • Python and Ruby are two other languages that can play similar roles • not compiled • can be included on web servers • similar intent of easy file and text manipulations • Using Perl is a personal preference for me • learned first, haven't felt anything missing • included in almost every Unix distribution
EXTERIOR: DAGOBAH -- DAY With Yoda strapped to his back, Luke climbs up one of the many thick vines that grow in the swamp until he reaches the Dagobah statistics lab. Panting heavily, he continues his exercises -- grepping, installing new packages, logging in as root, and writing replacements for two-year-old shell scripts in Python. YODA: Code! Yes. A programmer's strength flows from code maintainability. But beware of Perl. Terse syntax... more than one way to do it... default variables. The dark side of code maintainability are they. Easily they flow, quick to join you when code you write. If once you start down the dark path, forever will it dominate your destiny, consume you it will. LUKE: Is Perl better than Python? YODA: No... no... no. Quicker, easier, more seductive. LUKE: But how will I know why Python is better than Perl? YODA: You will know. When your code you try to read six months from now.
Today's Exercises • Modify the word counting script so it returns only the top 10 words in a file • Write a program that outputs the list of files in a directory, but listed in decreasing order of size • Same, but in order of "last modified" (search for "perl file test operators") • Search for pairs of files (e.g. "Song01" and "Song01.f". For each, report whether the second file is newer than the first
Resources • Learning Perl by O'Reilly • http://proquestcombo.safaribooksonline.com/0596101058 • Perl books on-line • http://www.perl.org/books/library.html • CPAN – Comprehensive Perl Archive Network • http://www.cpan.org/ • Perl Monks • http://www.perlmonks.org/