Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May...
Transcript of Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May...
![Page 1: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/1.jpg)
Idiomatic Perl
Dave CrossOutcome Technologies
![Page 2: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/2.jpg)
Introduction
![Page 3: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/3.jpg)
Larry Says
● "You can program in Perl Baby-Talk and we promise not to laugh"
● But eventually, it's nice to be able to use the strengths of the language
![Page 4: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/4.jpg)
What is Idiomatic Perl?
● Using the strengths of the language
● Stop writing C or BASIC or sh
● Make you look like a guru!
![Page 5: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/5.jpg)
What We Will Cover
● "use strict" and "use warnings"
● Variables (Package vs Lexical)
● Perl References
● Finding, Installing and Using Modules
● Creating Reuseable Code
● Sorting
● Cartoon Swearing
● "foreach" vs "grep" vs "map"
● Boolean operators as conditionals
● Statement modifiers
● Assignment Operators
● Quoting
![Page 6: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/6.jpg)
use strict and use warnings
![Page 7: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/7.jpg)
Be careful out there
● "use strict" and "use warnings" can catch many tricky bugs
● A very good habit to get into
● Programming with a safety net
● "BUGS: The -w switch is not mandatory." - Larry Wall
![Page 8: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/8.jpg)
use strict
● refs - no symbolic references
● subs - no barewords
● vars - no undeclared variables
● turn them off carefully with "no strict"
![Page 9: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/9.jpg)
use strict 'refs'
● Prevents symbolic references
● aka "using a variable as another variable's name"$what = 'slayer';$$what = 'Buffy'; # sets $slayer to 'Buffy'
● What if 'slayer' came from user input?
● Better to use a hash$what = 'slayer'; $people{$what} = 'Buffy';
● Self contained namespace
● Less chance of clashes
● More information (e.g. all keys)
![Page 10: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/10.jpg)
use strict 'subs'
● No barewords
● Bareword is a word with no other interpretation
● e.g. word without $, @, %, &
● Treated as a function call or a quoted string$slayer = buffy;
● May clash with future reserved words
![Page 11: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/11.jpg)
use strict 'vars'
● Forces predeclaration of variable names
● Prevents typos
● Less like BASIC - more like Ada
● Many ways to predeclare variables
● "my", "use vars", "our"
● Fully qualified names ($main::foo)
● Thinking about variable scope is good!
![Page 12: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/12.jpg)
use warnings
● Warns against dubious programming habits
● use warnings available since 5.6.0
● use warnings is more flexible than -w
![Page 13: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/13.jpg)
Some typical warnings
● Variables used only once
● Using undefined variables
● Writing to read-only file handles
● And many more...
![Page 14: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/14.jpg)
Turning off warnings
● Need a very good reason!{ no warnings; # since 5.6.0 # do dodgy stuff}
● Previously, fiddle with $^W{ local $^W = 0; # do dodgy stuff}
![Page 15: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/15.jpg)
More info
● perldoc strict
● perldoc warnings
● perldoc perlrun (for -w)
![Page 16: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/16.jpg)
Perl Variables
![Page 17: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/17.jpg)
Package and Lexical Variables
● Perl variables are of two types
● Important to know the difference
● Package variables are created by default
● Lexical variables are created with "my"
![Page 18: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/18.jpg)
Package Variables
● Live in the package's symbol table
● Can be refered to using a fully qualified name - $main::slayer or @Buffy::scoobies
● Can be seen from anywhere in the package (or anywhere at all when qualified)
● Can be predeclared with "use vars" or "our"use vars qw($slayer @scoobies %powers);our ($slayer, @scoobies, %powers);
![Page 19: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/19.jpg)
Lexical Variables
● Created with "my"
● Live in a pad (associated with a block)
● Only visible within enclosing block
● "Lexical" because the scope is defined purely by the text
![Page 20: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/20.jpg)
my vs local
● We now know what "my" does, but what about "local"?
● "local" is very badly named (it doesn't create a local variable)
● Saves value of package variable
● Previous value restored on exiting block
![Page 21: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/21.jpg)
my vs local example$x = $y = 'foo';print "OUT: x = $x, y = $y\n";print "OUT: x = $main::x, y = $main::y\n";{ local $x = 'bar'; my $y = 'bar'; print "IN: x = $x, y = $y\n"; i print "IN: x = $main::x, y = $main::y\n";}print "OUT: x = $x, y = $y\n";print "OUT: x = $main::x, y = $main::y\n";
● Output:OUT: x = foo, y = fooOUT: x = foo, y = fooIN: x = bar, y = barIN: x = bar, y = fooOUT: x = foo, y = fooOUT: x = foo, y = foo
● Within the block $main::y is different to $y
![Page 22: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/22.jpg)
When to use local or my
● Easy answer - always use "my"
● Slightly more complex answer - always use "my" (except when it doesn't work)
● Full answer (by Mark-Jason Dominus) - http://perl.plover.com/FAQs/Namespaces.html http://perl.plover.com/local.html
![Page 23: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/23.jpg)
More info
● perldoc -f local
● perldoc -f my
● perldoc -f our
● perldoc -q lexical
● perldoc perlsub
![Page 24: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/24.jpg)
Perl References
![Page 25: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/25.jpg)
References
● A reference is a bit like a pointer in languages like C and Pascal (but better)
● A reference is a unique way to refer to a variable
● A reference can always fit into a scalar variable
● A reference looks like SCALAR(0x20026730)
![Page 26: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/26.jpg)
Creating References
● Put \ in front of a variable name$scalar_ref = \$scalar;$array_ref = \@array;$hash_ref = \%hash;
● Can now treat it just like any other scalar$var = $scalar_ref;$refs[0] = $array_ref;$another_ref = $refs[0];
● It's also possible to create references to anonymous variables (similar to allocating memory using malloc in C)
● Create a reference to an anonymous array using [ ... ]$arr = [ 'an', 'anon', 'array' ];
● Create a reference to an anonymous hash using{ ... }$hash = { 1 => 'an', 2 => 'anon', 3 => 'hash' };
![Page 27: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/27.jpg)
Creating References (cont)@arr = (1, 2, 3, 4);$aref1 = \@arr;$aref2 = [@arr];print "$aref1 $aref2";
● Output:ARRAY(0x20026800) ARRAY(0x2002bc00)
● Second method creates a copy of the array
![Page 28: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/28.jpg)
Using References
● Use {$aref} to get back an array that you have a reference to@array = @{$aref}; # original array@rev = reverse @{$aref};$elem = ${$aref}[0]; # one element${$aref}[0] = 'foo';
● Use {$href} to get back a hash that you have a reference to%hash = %{$href}; # original hash@keys = keys %{$href};$elem = ${$href}{key}; # one element${$href}{key} = 'foo';
● You can find out what a reference is referring to using "ref"$aref = [ 1, 2, 3 ];print ref $aref; # prints ARRAY$href = { 1 => 'one', 2 => 'two' };print ref $href; # prints HASH
![Page 29: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/29.jpg)
Why Use References?
● What does this do?@arr1 = (1, 2, 3);@arr2 = (4, 5, 6);check_size(@arr1, @arr2);
sub check_size { my (@a1, @a2) = @_; print @a1 == @a2 ? 'Yes' : 'No';}
● This doesn't work
● Why doesn't it work?
● Arrays are combined in @_
● All elements end up in @a1
● How do we fix it?
● Pass references to the arrays
![Page 30: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/30.jpg)
Why Use References? (cont)
● Another attempt@arr1 = (1, 2, 3);@arr2 = (4, 5, 6);check_size(\@arr1, \@arr2);
sub check_size { my ($a1, $a2) = @_; print @$a1 == @$a2 ? 'Yes' : 'No';}
![Page 31: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/31.jpg)
Complex Data Structures
● Another good use for references
● Try to create a 2D array@arr_2d = ((1, 2, 3), (4, 5, 6), (7, 8, 9));
● This doesn't work
● @arr_2d contains (1, 2, 3, 4, 5, 6, 7, 8, 9)
● This is known a array flattening
![Page 32: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/32.jpg)
Complex Data Structures (cont)
● 2D Array using references@arr_2d = ([1, 2, 3], [4, 5, 6], [7, 8, 9]);
● But how do you access individual elements?
● $arr_2d[1] is ref to array (4, 5, 6)
● $arr_2d[1]->[1] is element 5
![Page 33: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/33.jpg)
Complex Data Structures (cont)
● Another 2D Array$arr_2d = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
● $arr_2d->[1] is ref to array (4, 5, 6)
● $arr_2d->[1]->[1] is element 5
● Can omit intermediate arrows: $arr_2d->[1][1]
![Page 34: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/34.jpg)
More Complex Data Structures
● Suppose you have a data file like this:Summers,Buffy,SlayerGiles,Rupert,WatcherRosenburg,Willow,WitchSummers,Dawn,Key
● What's a good data structure?
● Array of hashes
![Page 35: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/35.jpg)
Building More Complex Data Structures
● Building an array of hashesmy @records; my @cols = qw(s_name f_name job);while (<FILE>) { chomp; my %rec; @rec{@cols} = split /,/; push @records, \%rec;}
● Using an array of hashesforeach (@records) { print "$_->{f_name} $_->{s_name} "; print "is a $_->{job}\n";}
![Page 36: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/36.jpg)
Even More Complex Data Structures
● Many more possibilities
● Hash of hashes
● Hash of arrays
● Multiple levels (array of hash of hash, etc.)
● Lots of examples in perldoc perldsc (the data structures cookbook)
![Page 37: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/37.jpg)
More Information
● perldoc perlreftut
● perldoc perlref
● perldoc perllol
● perldoc perldsc
![Page 38: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/38.jpg)
Finding, Installing and Using Modules
![Page 39: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/39.jpg)
Modules
● A module is a reusuable 'chunk' of code
● Perl comes with over 100 modules (see perldoc perlmodlib for list)
● Perl has a repository of freely-available modules - the Comprehensive Perl Archive Network (CPAN)
● http://www.cpan.org/
● http://search.cpan.org/
![Page 40: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/40.jpg)
Finding Modules
● http://search.cpan.org
● Search by module name, distribution name or Author name
● Note: CPAN also contains newer versions of standard modules
![Page 41: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/41.jpg)
Installing Modules (the hard way)
● Download distribution fileMyModule-X.XX.tar.gz
● Unzipgunzip MyModule-X.XX.tar.gz
● Untartar xvf MyModule-X.XX.tar
● Change directorycd MyModule-X.XX
![Page 42: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/42.jpg)
Installing Modules (the hard way) (cont)
● Create Makefileperl Makefile.PL
● Build Modulemake
● Test Buildmake test
● Install Modulemake install
![Page 43: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/43.jpg)
Installing Modules (the hard way) (cont)
● Note: May need root permissions for make install
● You can have your own personal module libraryperl Makefile.PL PREFIX=~/perl
● (need to adjust @INC)
![Page 44: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/44.jpg)
Installing Modules (the easy way)
● Note: May not work (or may need some configuration) through a firewall
● CPAN.pm is included with standard Perl distribution
● Automatically carries out installation process
● Can also handle required modules
● Still need to be root
![Page 45: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/45.jpg)
Installing Modules (the easy way) (cont)
● CPAN.pmperl -MCPAN -eshellCPAN> install My::Moduleperl -MCPAN -e"install 'My::Module'"
● Also see CPANPLUS
![Page 46: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/46.jpg)
Using Modules
● Two types of module
● Function vs Object
● Functional modules export new subroutines and variables into your program
● Object modules usually don't
● Difference not clear cut (e.g. CGI.pm)
![Page 47: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/47.jpg)
Using Functional Modules
● Import defaults:use My::Module;
● Import optional components:use My::Module qw(my_sub @my_arr);
● Import defined sets of components:use My:Module qw(:advanced);
● Use imported components:$data = my_sub(@my_arr);
![Page 48: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/48.jpg)
Using OO Modules
● Use the module:use My::Object;
● Create an object:$obj = My::Object->new;
● (Note: "new" is just a convention)
● Interact using object's methods:$obj->set_name($name);
![Page 49: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/49.jpg)
Useful Standard Modules
● constant - Creates constant values
● File::Copy - Copy files
● Time::Local - Convert times to epoch
● POSIX - Interface to POSIX
● Text::Parsewords - Parse words from text
● CGI - CGI applications
![Page 50: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/50.jpg)
Useful Standard Modules (cont)
● Getopt::Std - Process command line options
● Carp - Better warn and die
● Cwd - Current working directory
● Benchmark - Timing code
● File::Basename - Break up filenames
● Data::Dumper - Dump data to text
![Page 51: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/51.jpg)
Useful Non-Standard Modules
● Template - Insert data in boilerplate text
● DBI - Database access
● libnet - Various network protocols (e.g. Net::FTP)
● Time::Piece - Date/Time manipulation
● libwww - HTTP client library
● Number::Format - Formatting numbers
![Page 52: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/52.jpg)
Useful Non-Standard Modules (cont)
● HTML::Parser - Parsing HTML
● XML::Parser - Parsing XML
● Text::CSV - Parse CSV data
● Regexp::Common - Common regular expressions
● MIME::Lite - Creating and sending MIME emails
● Memoize - Cache function return values
![Page 53: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/53.jpg)
More Information
● perldoc perlmodlib
● perldoc perlmodinstall
● perldoc CPAN
![Page 54: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/54.jpg)
Writing Reusable Code
![Page 55: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/55.jpg)
Why write modules?
● Code reuse
● Prevent reinventing the wheel
● Easier to share across projects
● Better design, more generic
![Page 56: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/56.jpg)
Basic Moduleuse strict;package MyModule;use vars qw(@ISA @EXPORT);use Exporter;@ISA = ('Exporter');@EXPORT = ('my_sub');
sub my_sub { print "This is my_sub\n";}
1;
![Page 57: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/57.jpg)
Using Your Moduleuse MyModule;
# my_sub is now available for use# within your program
my_sub(); # Prints "This is my_sub()"
![Page 58: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/58.jpg)
Exporting Symbol Names
● Most of MyModule.pm is concerned with exporting subroutine names
● Exporting names allows your caller to use the subroutine as my_sub() instead of MyModule::my_sub()
![Page 59: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/59.jpg)
The import Subroutine
● The module Exporter.pm handles the export of subroutine (and variable) names
● Exporter.pm defines a subroutine called import
● import is automatically called whenever a module is used
● import puts references to our subroutines into our callers symbol table
![Page 60: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/60.jpg)
Using @ISA
● How does MyModule use Exporter's import subroutine?
● We make use of inheritance
● Inheritance is defined using @ISA
● If we call a subroutine that doesn't exist in our module, then the modules in @ISA are also checked
@ISA = ('Exporter');
● Therefore Exporter::import is called
![Page 61: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/61.jpg)
Using @EXPORT and @EXPORT_OK
● How does import know which subroutines to export?
● Exports are defined in @EXPORT or @EXPORT_OK
● Automatic exports are defined in @EXPORT
● Optional exports are defined in @EXPORT_OK
![Page 62: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/62.jpg)
Using %EXPORT_TAGS
● You can define sets of exports in %EXPORT_TAGS
● Key is set name (without the colon)
● Value is reference to an array of names%EXPORT_TAGS = (advanced => [qw(my_sub my_other_sub)];use MyModule qw(:advanced);my_sub();my_other_sub();
![Page 63: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/63.jpg)
@EXPORT or @EXPORT_OK
● Why use @EXPORT_OK
● Give your users the choice of which subroutines to import
● Less chances of name clashes
● Use @EXPORT_OK in preference to @EXPORT
● Document the exported names and sets
![Page 64: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/64.jpg)
Exporting Variables
● You can also export variables@EXPORT_OK = qw($scalar @array %hash);
● Any variables you export must be package variables
![Page 65: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/65.jpg)
Writing Modules The Easy Way
● Use h2xs to create a skeleton moduleh2xs -A -X -n MyModule
● Creates six files
● MANIFEST, Makefile.PL, MyModule.pm, test.pl, README and CHANGES
● These are the standard module package files
● Follows the same conventions as CPAN modules
![Page 66: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/66.jpg)
Writing Objects
● An Object is just a module that obeys certain extra rules
● A Class is a package
● An Object is a reference (usually to a hash)
● A Method is a subroutine
● "bless" tells a reference what kind of object it is
![Page 67: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/67.jpg)
A Simple Objectpackage Slayer;sub new { my $class = shift; my $name = shift; my $self = { name => $name }; return bless $self, $class;}
sub get_name { my $self = shift; return $self->{name};}
sub set_name { my $self = shift; $self->{name} = shift;}
1;
![Page 68: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/68.jpg)
Using The Slayer Objectuse Slayer;
my $obj = Slayer->new('Buffy');print $obj->get_name; # prints 'Buffy'$obj->set_name('Faith');print $obj->get_name; # prints 'Faith'
![Page 69: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/69.jpg)
More Information
● perldoc perlmod
● perldoc perlboot
● perldoc perltoot
● perldoc perlobj
● perldoc h2xs
● perldoc Exporter
● Object Oriented Perl - Damian Conway
![Page 70: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/70.jpg)
Sorting
![Page 71: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/71.jpg)
Basic Sorting
● Perl has a sort function that takes a list and sorts it@sorted = sort @array;
● Note that it does not sort the list in place@array = sort @array;
![Page 72: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/72.jpg)
Default Sorts
● The default sort order is ASCII@chars = sort 'e', 'b', 'a', 'd', 'c';# @chars has ('a', 'b', 'c', 'd', 'e')
● This can sometimes give strange results@chars = sort 'E', 'b', 'a', 'D', 'c';# @chars has ('D', 'E', 'a', 'b', 'c')@nums = sort 1 .. 10;# @nums has (1, 10, 2, 3, 4, 5, 6, 7, 8, 9)
![Page 73: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/73.jpg)
Defining Sort Criteria
● Can add a "sorting block" to customise sort order@nums = sort { $a <=> $b } 1 .. 10;
● Perl puts two of the values from the list into $a and $b
● Block compares values and returns -1, 0 or 1
● <=> does this for numbers
● cmp does this for strings
![Page 74: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/74.jpg)
Examples of Sort Blocks
● Other simple sort examplessort { $b cmp $a } @wordssort { lc $a cmp lc $b } @wordssort { substr($a, 4) cmp substr($b, 4) } @lines
![Page 75: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/75.jpg)
Using a Sort Subroutine
● Can also use a subroutine name in place of a code blocksub dictionary { my ($A, B) = ($a, $b); $A =~ s/\W+//g; $B =~ s/\W+//g; $A cmp $B;}my @dict = sort dictionary @words;
![Page 76: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/76.jpg)
More Complex Sortsmy @names = ('Buffy Summers', 'Rupert Giles', 'Willow Rosenberg', 'Dawn Summers');
@names = sort sort_names @names;
● Need to write "sort_names" so that it sorts on surname and then forename.
sub sort_names { my @a = split /\s/, $a; my @b = split /\s/, $b; return $a[1] cmp $b[1] || $a[0] cmp $b[0];}
● This can inefficient on large amounts of data
● Multiple splits on the same data
![Page 77: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/77.jpg)
More Efficient Complex Sorts
● Split each row only once@split = map { [ split ] } @names;
● Do the comparision@sort = sort { $a->[1] cmp $b->[1] || $a->[0] cmp $b->[0] } @split;
● Join the data together@names = map { join ' ', @$_ } @sort;
![Page 78: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/78.jpg)
Putting It All Together
● Can rewrite this as@names = map { join ' ', @$_ } sort { $a->[1] cmp $b->[1] || $a->[0] cmp $b->[0] } map { [ split ] } @names;
● All functions work on the output from the previous function in the chain
![Page 79: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/79.jpg)
The Schwartzian Transform@data_out = map { $_->[1] } sort { $a->[0] cmp $a->[0] } map { [func($_), $_] } @data_in;
![Page 80: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/80.jpg)
More Information
● perldoc -f sort
![Page 81: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/81.jpg)
Cartoon Swearing
![Page 82: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/82.jpg)
Special Variables
● Perl has a number of special built-in variables that we can use
● Often named with punctuation characters ($_) or control characters ($^W)
● Always in main package
● Can't create with "my" - always use "local"
● Only alter them localised in a block{ local $^W = 0; # do stuff...}
![Page 83: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/83.jpg)
The Default Variable - $_
● $_ is the default argument or operand for many functions and operators
● Functions (print, lc, chr)
● Operators (m//, s///, tr///)
● When $_ is being used you often don't see itwhile (<FILE>){ next unless /^http/; print;}
![Page 84: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/84.jpg)
Input Record Separator - $/
● We know that <FILE> reads one record from the filehandle FILE
● But what defines a 'record'?
● <FILE> actually reads up to and including the next occurance of $/
● Default value is "\n"
![Page 85: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/85.jpg)
The fortune Program
● The Unix "fortune" program reads files in this format'A witty quote' -- Oscar Wilde%%'Something deep and meaningful' -- William Shakespeare
● Quotes are separated by "\n%%\n"my @quotes;{ local $/ = "\n%%\n"; @quotes = <FORTUNE>; chomp @quotes;}
print $quotes[rand @quotes];
● Note: $/ also effects "chomp"
![Page 86: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/86.jpg)
Special Values For $/$/ = undef;
● Puts Perl into 'slurp' mode.
● Next call to <FILE> will read in all remaining data$/ = ''; # empty string
● Puts Perl into 'paragraph' mode.
● Records are defined by one or more blank lines$/ = \1024; # or \$number
● Reads up to 1024 bytes
![Page 87: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/87.jpg)
Current Record Number - $.
● No need to keep a count of the current record numberwhile (<FILE>) { print "$.: $_";}
● Note: contains current record number from most recently read filehandle
● Note: reset to zero on close
![Page 88: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/88.jpg)
Output Control Variables
● $\ is the output record separator
● Appended to the output to each print call. Default value is the empty string
● $| controls autoflushing on the current default output filehandle
● Default is 0 which buffers output if it's going to a file
![Page 89: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/89.jpg)
More Output Control Variables
● $, is the output field separator
● Controls what is output between the arguments to "print"@nums = 1 .. 3;print @nums; # 123 $, = ' - ';print @nums; # 1 - 2 - 3
● Default value is the empty string
● $" is the list separator
● Controls what is put between the elements of an array (or array slice) when interpolated in a double quoted string
@nums = 1 .. 3;print "@nums"; # 1 2 3$" = '|';print "@nums"; # 1|2|3
● Default is a space
![Page 90: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/90.jpg)
$, vs $"
● $, and $" do very similar things
● Actually they do completely different things
● Easy to get them confused@nums = 1 .. 3;$, = '+';$" = '-';print @list; # prints 1+2+3print "@list"; # prints 1-2-3
● Think about what is actually being passed to "print"
● $" really has nothing to do with "print"$" = '-';@nums = 1 .. 3;$nums = "@nums"; 1-2-3
![Page 91: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/91.jpg)
Error Variables
● $! contains the error from the last operating system callopen FILE, 'file' or die $!;
● $? contains the error from the last child process@file = `ls`;die $? if $?;
● $@ contains the error from the last "eval" calleval { require Module };die $@ if $@;
![Page 92: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/92.jpg)
Process Variables
● $0 contains the name of the current program name
● $$ contains the process ID
● $<, $( contain the real user and group IDs
● $>, $) contain the effective user and group IDs
![Page 93: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/93.jpg)
Useful Environment Information
● $^O contains the operating system
● $] and $^V contain different representations of the Perl versionprint $]; # 5.006001printf '%vd', $^V; # 5.6.1
● %ENV contains all of the environment variables
![Page 94: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/94.jpg)
Regular Expression Variables
● $1, $2, etc contain any captured subpatternswhile (<MAIL>) { if (/^Subject:\s*(.*)/) { print "The subject was: $1\n"; }}
● $` contains the part of the target string that came before the last regex match
● $& contains the part of the target string that matched the last regex
● $' contains the part of the target string that came after the last regex match
● Useful for debugging regular expressions
![Page 95: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/95.jpg)
Regex Debugging$_ = 'This is a string';if (/is (\w+) (\w+)/) { print "$1 : $2\n";}
● Prints "is : a"
● To see what went wrong try thisif (/is (\w+) (\w+)/) { print "$`<$&>$'\n";}
● "Th<is is a> string"
![Page 96: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/96.jpg)
More Information
● perldoc perlvar
![Page 97: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/97.jpg)
Context
![Page 98: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/98.jpg)
Context
● Be aware of context
● Code can often do completely different things in different contexts
print localtime;print scalar localtime;
● Differences can be hard to spotprint localtime , "\n";print localtime . "\n";
![Page 99: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/99.jpg)
Contextual Differences
● There is no way to work out what an operator or function will do in a given context
@a = reverse(1, 2, 3) # (3, 2, 1)$s = reverse('123') # '321'print reverse('123') # '123'
![Page 100: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/100.jpg)
Knowing Your Context
● You can find out what context your function has been called in by using the (badly named) "wantarray"
sub what { if (defined wantarray) { if (wantarray) { print "list\n" } else { print "scalar\n"; } } else { print "void\n"; }}
what();$sca = what();@arr = what();
![Page 101: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/101.jpg)
More Information
● perldoc -f wantarray
● perldoc -f localtime
● perldoc -f many other functions and operators
![Page 102: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/102.jpg)
foreach vs grep vs map
![Page 103: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/103.jpg)
foreach vs grep vs map
● foreach, map and grep do very similar things.
● Important to choose the most appropriate
● grep and map are often better than a foreach loop - but not in void context
![Page 104: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/104.jpg)
Using grep@odds = grep { $_ % 2 } @ints;
● grep applies block to each element in the input list
● $_ is aliased to the element
● If block evaluates to true, $_ is added to the output list
![Page 105: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/105.jpg)
Using map@squares = map { $_ * $_} @ints;
● map applies block to each element in the input list
● $_ is aliased to the element
● Whatever is returned by the block is added to the output list
![Page 106: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/106.jpg)
More with map
● The output list doesn't need to be the same length as the input list
%squares = map { $_, $_ * $_ } @ints;
● or%squares = map { $_ => $_ * $_ } @ints;
![Page 107: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/107.jpg)
Bad Uses of map and grep
● Don't use map or grep in a void contextmap { $_ *= $_ } @ints;
● Use foreach insteadforeach (@ints) { $_ *= $_ };
● or$_ *= $_ foreach @ints;
● This restriction is being worked on in latest Perls
![Page 108: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/108.jpg)
map & grep Caveatsif (grep { /some_pattern/ } @long) { ...}
● is inefficient as it always checks every element of @long
● A better solutionsub at_least_one_match { my $pattern = shift; foreach (@_) { return 1 if /$pattern/ } return; # No match}
if (at_least_one_match('pattern', @long)) { ...}
● But@matches = grep {/$pattern/ } @list;
● Is better thanforeach (@list) { push @matches, $item if /$pattern/;}
![Page 109: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/109.jpg)
More Information
● perldoc perlsyn (foreach)
● perldoc -f map
● perldoc -f grep
![Page 110: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/110.jpg)
Boolean Expressions as Conditionals
![Page 111: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/111.jpg)
Boolean Expressions as Conditionals
● In Perl Boolean expressions are short-circuiting
● Perl only does as much work as necessary
● (Laziness is a virtue!)EXPR1 or EXPR2
● Only need to evaluate EXPR2 if EXPR1 is falseEXPR1 and EXPR2
● Only need to evaluate EXPR2 if EXPR1 is true
![Page 112: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/112.jpg)
The open Idiom
● Probably the most common Perl idiomopen FILE, $file or die "Can't open $file: $!";
● If "open" returns true then the "die" call isn't evaluated
● If "open" returns false then the "die" call must be evaluated
![Page 113: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/113.jpg)
Precedence Issues
● This doesn't do what you wantopen FILE, $file || die $!;
● Perl parses this asopen FILE, ($file || die $!);
● Use lower precendence "or"open FILE, $file or die $!;
● Or use parenthesesopen(FILE, $file) || die $!;
![Page 114: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/114.jpg)
Some Other Examples/match/ and process($_)$DEBUG and print 'debug message'@ARGV == 2 or &usage
![Page 115: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/115.jpg)
More Information
● perldoc perlop
![Page 116: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/116.jpg)
Statement Modifiers
![Page 117: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/117.jpg)
Statement Modifiers
● Perl allows you to put a statement modifier at the end of each statement
● This is a conditional (if or unless) or a loop (foreach, while or until)
● This simplifies some codeprocess($_) if /match/print 'debug message' if $DEBUG&usage unless @ARGV == 2print "$. : $_" while <FILE>$_ *= $_ foreach @ints
![Page 118: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/118.jpg)
Statement Modifiers & Boolean Conditionals
● Note the similarities and differences between these/match/ and process($_)process($_) if /match/
● There's more than one way to do it
● Choose the one that makes the code more readable
![Page 119: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/119.jpg)
More Information
● perldoc perlsyn
![Page 120: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/120.jpg)
Assignment Operators
![Page 121: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/121.jpg)
Assignment Operators
● Perl has a number of assignment operators that it shares with other languages
● +=, -=, *=, /=
● But Perl extends the list greatly
● %=, .=, x=, ||=
● Look for an assignment operator version of just about any binary operator
![Page 122: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/122.jpg)
Using Assignment Operators$year %= 100;$line .= "\n";$indent x= 4;$value ||= $default;
![Page 123: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/123.jpg)
Problems With ||=
● There's one small problem with ||=
● It checks truth, not defined-ness
● Can't use it if 0 or '' are valid values$value = 0;$value ||= 2; # $value is now 2
● Perl 6 will introduce the //= operator$value = 0;$value //= 2; # $value is still 0
![Page 124: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/124.jpg)
More Information
● perldoc perlop
![Page 125: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/125.jpg)
Quoting
![Page 126: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/126.jpg)
Quoting
● Perl has two types of quotes
● Single quotes contain literal strings
● Double quotes interpolate variables and escape sequences (e.g. "\n")
● Escape interpolated characters with a backslashprint "\$var is $var"
![Page 127: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/127.jpg)
Overusing Backslashes
● Have you ever done this?print "<img src=\"$file\" width=\"100\" height=\"50\">";
● Nasty isn't it?
● This is much nicerprint qq(<img src="$file" width="100" height="50">);
● qq// allows you to choose your own quote characters
![Page 128: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/128.jpg)
qq// Examples
● Use any characterqq[some $text]qq<some $text>qq{some $text}qq!some $text!qq/some $text/qq#some $text#qq asome $texta (please forget this at once)
![Page 129: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/129.jpg)
Other Quotes
● The same thing works for single quotes using q//q[some text]q!some text!
● Also works for s///, m// and tr///s(something)[something else]m|/a/directory/name|tr=A-Z=a-z=
![Page 130: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/130.jpg)
Quoting to Build Lists
● The qw// operator splits a string on whitespace and single quotes each element
@days = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');@days = qw(Sun Mon Tue Wed Thu Fri Sat);
![Page 131: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/131.jpg)
More Information
● perldoc perlop
![Page 132: Dave Cross Outcome Technologies - Magnum Solutions · Installing Modules (the easy way) Note: May not work (or may need some configuration) through a firewall CPAN.pm is included](https://reader034.fdocuments.in/reader034/viewer/2022042219/5ec5dab0148dbc039436dba5/html5/thumbnails/132.jpg)
The End
● That's All Folks
● Any Questions?