SlideShare a Scribd company logo
1 of 159
Getting Started with Perl
                     University of Perl, October 2000
                                          brian d foy


                   http://www.pair.com/~comdog/Talks/perl_university.pdf
                                          v3.6.7.4




Copyright © 2000, O’Reilly & Associates
Introduction



Copyright © 2000, O’Reilly  Associates
About this talk
           • Perl has over 1,000 pages of printed
           documentation.

           • This talk is only two days – a brief tour of Perl

           • Some things will not be the whole truth to
           simplify things

           • Remember you have heard about this stuff, then
           refer to the notes and references later.




Copyright © 2000, O’Reilly  Associates
What is Perl?
           • General purpose programming language
              Databases, networking, system interaction, ...

           • High level programming language

           • The best things from C, awk, sed, and many
           other languages

           • “The duct tape of the internet” – Hassan Schroeder

           • A mix of object oriented and procedural styles




Copyright © 2000, O’Reilly  Associates
Why use Perl?
           • Rapid prototyping

           • Compact – faster to write and shorter to debug

           • Memory management and other mundane tasks
           handled automatically

           • Portable – Unix, Windows, Mac, OS/2

           • Maximum expressivity




Copyright © 2000, O’Reilly  Associates
Understanding Perl
           • To understand Perl, understand its creator
               linguistics, computer science, and a lot more
           • Easy things should be easy, and hard things
           should be possible
           • The problem space is messy, so one needs a
           messy language
           • There’s more than one way to do it
           (TMTOWTDI)
           • You do not have to know everything (“baby
           talk” is officially okay)




Copyright © 2000, O’Reilly  Associates
Brief history of Perl
           • Perl 1.0 was released in 1987 – before the Web!
           • Released to Net, which suggested changes (and
           changes, and changes, and ... )
           • The “camel” book is published – Programming
           perl; and Perl 4 is released
           • Perl 5.0 was released in 1994
               extensible design  third party modules
               references  complex data structures
               object oriented features
           • For the most complete Perl history:
           	      http://history.perl.org




Copyright © 2000, O’Reilly  Associates
Getting Perl
           • Latest version is Perl 5.6.0

           • Comprehensive Perl Archive Network (CPAN)
           	      http://www.cpan.org	and	http://search.cpan.org
           • Source is available at
           	      http://www.cpan.org/src/index.html
           • Linux, Solaris, and Win  NT versions available
           from ActiveState
           	      http://www.activestate.com

           • Some operating systems may already have Perl
           	      http://www.perl.org/phbs/vendors.html
           • Other operating system versions available at
           	      http://www.cpan.org/ports/index.html


Copyright © 2000, O’Reilly  Associates
Finding Perl information
           • Perl man pages (1000+ pages of printed docs!)
           	      man	perl
           	      perldoc	perl
           	      perldoc	-f	function
           • Available as HTMLHelp on Win32
           • Perldoc.com
           	      http://www.perldoc.com
           • Comprehensive Perl Archive Network (CPAN)
           	      http://www.cpan.org,	http://search.cpan.org
           • The Perl Language Page
           	      http://www.perl.com
           • Perl Mongers
           	      http://www.perl.org



Copyright © 2000, O’Reilly  Associates
Perl program basics
           • Scripts are just text files – use any text editor

           • Syntax is like C (mostly)
              whitespace is insignificant
              statements end in semicolons

           • Comments are from # to end of line
           	      print	quot;Viva	Las	Vegasnquot;;			#this	is	a	comment


           • Variables do not need to be declared
           • The perl interpreter compiles and runs script



Copyright © 2000, O’Reilly  Associates                            0
Perl scripts
           • First line is the “shebang” line

           	      #!/usr/bin/perl
           	      #!/usr/bin/perl	-w


           • Can also run from the command line

           	      perl	script.pl
           	      perl	-w	script.pl
           	      perl	-cw	script.pl


           • See the perlrun man page for more command-
           line switches


Copyright © 2000, O’Reilly  Associates
Script example
           • As a text file
           	      #!/usr/bin/perl	-w

           	      my(	$date	)	=	(	localtime	)[3];
           	      print	quot;Today	is	$datenquot;;


           • On the command line ( a “one-liner” )
           	
           	      #	Sands:Keno:4000
           	      perl	-naF:	-e	'print	$F[2]'		input_file




Copyright © 2000, O’Reilly  Associates
Data



Copyright © 2000, O’Reilly  Associates
Scalar data
           • Literal data are either scalars or lists

           • A scalar is a single value
           • Scalars are either strings or numbers

           • Strings are sequences of characters
           	      'Dino',	'5',	'Chairman',	''
           • Numbers can be expressed in many forms
           	      42,	3.14e7,	6.022E23,	0xFF,	0377,	-2


           • Perl switches between numbers and strings
           as needed



Copyright © 2000, O’Reilly  Associates
Numbers
           • Numbers are computed with double-precision

           • One of few problems where the underlying
           architecture shows through

           • Can be written in many ways – embedded
           underscores are ignored

           	      4294967295
           	      4_294_967_295	
           	      0xFFFFFFFF
           	      0xFF_FF_FF_FF
           	      0b1111_1111_1111_1111	 #needs	5.6!
           	



Copyright © 2000, O’Reilly  Associates
Numeric operators
           • Arithmetic
           	      4	+	5
           	      5	-	4
           	      3	*	6
           	      6	/	3


           • Exponentiation
           	
           	      3	**	2
           	      2	**	(-3)
           	      (-1)	**	5		             #	no	complex	numbers	though!


           • Modulus
           	      17	%	2


Copyright © 2000, O’Reilly  Associates
Precedence  associativity
           • Just like C (or high school algebra)

           • Each operation has a precedence

           	      1	+		2	*	10	 			#	21,	not	30	(bust!)
           	      1	+	(2	*	10)	 			#	same	thing
           	      (1	+	2)	*	10				#	30

           	      2**2**3	 	              	   #	256,	not	64
           	      2**(2**3)		             	   #	same	thing
           	      (2**2)**3		             	   #	64


           • See the perlop man page for details



Copyright © 2000, O’Reilly  Associates
Numeric comparisons
           • What is truth? (that's a different course!)
              false – 0, '', undef
           	 true – everything else
           	      42			65								#	less	than,	TRUE
           	      65			42								#	greater	than,	TRUE
           	      65	==	65								#	equals,	TRUE
           	      4		==	3									#	equals,	FALSE
           	      4		!=	3									#	not	equals,	TRUE

           	      2		=	3									#	less	than	or	equal,	TRUE
           	      3		=	4									#	greater	than	or	equal,	FALSE

           • Negation
           	      !	25												#	not,	FALSE!
           	      not	25										#	same	as	!	25


Copyright © 2000, O’Reilly  Associates
Strings
           • Single quoted strings are as-is
           	      'This	is	a	string'
           	      'I'm	in	Las	Vegas'
           	      q|I'm	in	Las	Vegas|	#generalized	single	quotes


           • Double-quoted strings allow for special
           sequences
           	      quot;This	line	has	a	newlinenquot;			#	n	is	newline
           	      quot;A	tabtin	the	middlequot;								#	t	is	tab
           	      quot;He	said	quot;Foo!quot;quot;
           	
           	      #generalized	double	quotes
           	      qq|He	sings	quot;My	Wayquot;n|;	




Copyright © 2000, O’Reilly  Associates
String operators
           • Concatenation – the . operator
           	      'Hello	'	.	'World!'							#	'Hello	World!'
           	      'Dean'	.	'	'	.	'Martin'			#	'Dean	Martin'


           • Replication – the x operator
           	      'Hello	'	x	3			#	'Hello	Hello	Hello	'	


           • Generalized quoting
           	      q|Dean	Martin's	favorite	drink|
           	      q(Dean	Martin's	favorite	drink)

           	      qq|Sinatra	sings	quot;$song_namequot;|




Copyright © 2000, O’Reilly  Associates                        0
String comparisons
           • Uses FORTRAN-like operators
           • Compares quot;ASCIIbeticallyquot;, not alphabetically

           	      'Peter'	gt	'Joey'					#	greater	than,	TRUE
           	      'Sammy'	lt	'Dean'					#	less	than,	FALSE
           	      'Frank'	eq	'frank'				#	equals,	FALSE
           	      'Frank'	ne	'Peter'				#	not	equals,	TRUE

           	      'Frank'	ge	'Dean'					#	greater	or	equal,	TRUE
           	      'Frank'	le	'Joey'					#	lesser	or	equal,	TRUE

           	      '2'	gt	'10'											#	TRUE
           	




Copyright © 2000, O’Reilly  Associates
Numbers or strings?
           • Remember that Perl has scalars – either a
           number or a string
           • Perl figures out what to do based on context
           • Context is determined by the type of operation
           • Strings are converted to numbers ignoring
           everything after first non-digit
                  quot;1234	My	Wayquot;					becomes	1234
           	      5	+	quot;1234	My	Wayquot;	becomes	1239


           • Numbers are converted to strings
           	      '$'	.	(102/5);			#	becomes	'$20.4'	




Copyright © 2000, O’Reilly  Associates
List data
           • Lists are collections of scalars

           • List elements are indexed by numbers, starting
           at 0 (zero), like C.

           • Lists are created by using parentheses

           	      ('Sinatra',	'Martin',	'Lawford')

           	      qw(	Sinatra	Martin	Lawford	)		#Quote	Words

           	      (	0	..	9	)	             #	the	range	operator,	..




Copyright © 2000, O’Reilly  Associates
List Slice
           • Used to get part of a list

           	      ('Mon',	'Tue',	'Wed',	'Thu',	'Fri')[1,2]
           	
           • Negative numbers count from end
           	      ('Mon',	'Tue',	'Wed',	'Thu',	'Fri')[0,-1]


           • Useful with some funtions that return lists

           ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isd
           st)		 	 =	localtime();

           ($mon,	$mday,	$year)	=	(	localtime()	)[4,3,5]



Copyright © 2000, O’Reilly  Associates
Variables



Copyright © 2000, O’Reilly  Associates
Variable basics
           • No need to declare variables
           • Variables spring into existence when used
           • Perl handles the rest

           • Names start with a letter, followed by zero or
           more letters, digits, or underscores
           • Names are case sensitive
           • Names are preceded by a special character ($, @,
           %) to denote the variable type

           • Perl special variables (“punctuation variables”)
           start with non-letters – $_, $quot;, $/

Copyright © 2000, O’Reilly  Associates
Scalars
           • A scalar variable holds a single value – either a
           string or a number.

           • Scalar variable names start with a $ (looks like
           “S” for “scalar”)

           	      $hotel
           	      $casino
           	      $playing_tonight_at_the_Sands
           	      $string_01

           	      $*strip	           #	WRONG!	
           	      $2vegas	           #	WRONG!



Copyright © 2000, O’Reilly  Associates
Scalar assignment
           • The assignment operator is =
           	      $name		=	quot;Frank	Sinatraquot;;
           	      $title	=	'Chairman	of	the	Board';


           • Can be used to copy data
           	      $nickname	=	$title;


           • Scalars can be interpolated into strings

           	      print	quot;Tonight's	act	is	$namenquot;;


                  outputs: Tonight's act is Frank Sinatra



Copyright © 2000, O’Reilly  Associates
Controlling interpolation
           • To prevent interpolation, escape the $
           $brag	=	quot;I	won	$5,000	dollars	at	the	slots!quot;;


           • You can use single quotes if you don't want
           interpolation
           $brag	=	'I	won	$5,000	dollars	at	the	slots!';


           • Perl looks for the longest possible variable name
           $game	=	'Blackjack';
           $say		=	quot;Hello	$gameersquot;;				#Hello	!
           $say		=	quot;Hello	${game}ersquot;;		#Hello	Blackjackers!
           $say		=	quot;Hello	$gamequot;	.	quot;ersquot;;




Copyright © 2000, O’Reilly  Associates
Arrays
           • An array holds a list

           • No pre-defined size or bounds

           • Array variable names start with a @
                  @hotels
           	      @casinos
           	      @A_very_long_list_of_all_of_the_good_slots


           • @hotels has nothing to do with $hotels




Copyright © 2000, O’Reilly  Associates                        0
Array indices
           • Arrays are indexed by integers, starting at zero


                         Frank            Sammy Peter   Joey   Dean

                               0            1     2      3      4



           • Can use negative integers to count from end of
           list



Copyright © 2000, O’Reilly  Associates
Array assignment
           • Assign a list to an array
           	      @hotels	=	('Sands',	'MGM',	'Luxor');
           	      @hotels	=	qw(	Sands	MGM	Luxor	);

           • Copy arrays
           	      @casinos	=	@hotels;


           • Arrays can be interpolated into strings
           	
           	      print	quot;Casinos:	are	@casinosnquot;;
                  outputs: Casinos: are Sands MGM Luxor

           • Assigning an array to a scalar gives a count
           	      $n	=	@casinos;	#	$n	is	3


Copyright © 2000, O’Reilly  Associates
More array assignment
           • Assign to a list

           	      ($x,	$y,	$z)	=	@casinos;

           • Arrays on left hand side are greedy

           	      ($x,	@y)					=	@casinos;

           	      ($x,	@y,	$z)	=	@casinos;		#	$z	gets	nothing




Copyright © 2000, O’Reilly  Associates
Array element access
           • Use array name followed by index in [	]
           	      @casinos	=	('Sands',	'MGM',	'Luxor');
           	      $casinos[2];
           	      $casinos[$index];
           	      $casinos[$index	+	1];


           • Indices are converted to integers

           	      $casinos[2.25];				#	turns	into	$casinos[2]


           • Accessing past bounds gives undef
           	
           	      @casinos	=	qw(	Sands	MGM	Luxor	);
           	      $casino	=	$casinos[3];		#	UNDEF!


Copyright © 2000, O’Reilly  Associates
Array element assignment
           • Work with array element directly

           	      $casinos[3]	=	'MGM	Grand';


           • Assigning past bounds fills in elements with
           undef

           	      $casinos[20]	=	'Stardust';		#	4	-	19	get	undef


           • $#array_name is the index of the last element
           	      print	quot;The	last	index	is	$#casinosnquot;;
           	      #	add	element
           	      $casinos[	$#casinos	+	1	]	=	'Showboat';	



Copyright © 2000, O’Reilly  Associates
Array slices
           • Array slices are like list slices

           • Variable name followed by indices in [	]

           • Preceded by @ (because it is a list)

           	      ($x,	$y,	$z)	=	@casinos[1,5,6];

           	      @indices	=	(1,	5,	6);
           	      ($x,	$y,	$z)	=	@casinos[@indices];


           • Not for one element (warning with -w)
           	      @casinos[$index]		#	WRONG!	WRONG!	WRONG!


Copyright © 2000, O’Reilly  Associates
List operators
           • shift removes the first element
           	      @num	=	4	..	7;
           	      $first	=	shift	@num;				#	@num	is	(	5..7	)


           • unshift adds onto the head of the list

           	      unshift	@num,	$first;	#	@num	is	(	4	..	7	)
           	      unshift	@num,	1	..	3;	#	@num	is	(	1	..	7	)


           • push and pop do the same thing on the tail of the
           list

           	      $last	=	pop	@num;								#	@num	is	(	1	..	6	)
           	      push	@num,	$last,	8,	9;		#	@num	is	(	1	..	9	)


Copyright © 2000, O’Reilly  Associates
Scalar vs. list context
           • Perl decides what to do based on context

           	      $hotel	=	quot;Stardustquot;;
           	      @hotel	=	quot;Stardustquot;;			#	list	of	one	element

           	      $hotel	=	@hotels;						#	$hotel	get	a	count

           • Some functions behave differently

           	      @time	=	localtime;		#	like	we	saw	before
           	      $time	=	localtime;		#	Fri	Sep	24	14:37:21	1999


           • There is no general rule for converting a list to a
           scalar


Copyright © 2000, O’Reilly  Associates
There is no general
             rule for converting
               a list to a scalar


Copyright © 2000, O’Reilly  Associates
Hashes
           • Used to be called “associative arrays” (Perl 4)
           • Like arrays, but index is a unique string
           • Hash variable names start with a %

           	      %hotels
           	      %games
           	      %all_the_games_to_which_i_lost_money


           • Stored in an efficient fashion behind the scenes

           • %hotels has nothing to do with @hotels or
           $hotels



Copyright © 2000, O’Reilly  Associates                         0
More on hashes
           • Use a hash to map some data (“keys”) onto other
           data (“values”)

           • Keys have to be unique




   Keys                 Frank             Dean      Sammy        Joey     Peter


   Values              Sinatra            Martin   Davis, Jr.   Bishop   Lawford




Copyright © 2000, O’Reilly  Associates
Hash assignment
           • Assign a list, in key-value order
              %hash	=	('key1',	'value1',	'key2',	'value2'	);
           	 %hash	=	(	key1	=	'value1',	key2	=	'value2');
           	 %hash	=	(	
           													key1	=	'value1',
           													key2	=	'value2',
           												);


           • Copy hashes
           	      %casinos	=	%hotels;


           • Get list back (in no particular order!)
           	      @as_list	=	%hotels;



Copyright © 2000, O’Reilly  Associates
Hash element access
           • Use hash name followed by index in {	}
           	      $last_name{'Joey'}
           	      $last_name{$name}
           	      $last_name{'Jo'	.	'ey'}


           • Accessing an undefined index creates it
           	      $name{'Chairman'}	=	'Frank';


           • Check to see if a key exists.
           	      $exists	=	exists	$name{'Bobby'};
           • If key does not exist, exists does not create it.

           • Check to see if a value is defined
           	      $defined	=	defined	$name{'Dino'};


Copyright © 2000, O’Reilly  Associates
Hash operators
           • Get a list of all of the keys (in no particular
           order)
                  @keys	=	keys	%hash;


           • Get a list of corresponding values

           	      @values	=	keys	%hash;


           • Get the next key-value pair

           	      ($key,	$value)	=	each	%hash;




Copyright © 2000, O’Reilly  Associates
Hash slices
           • Variable name followed by indices in {	}

           • Preceded by @ (because it is a list)

           	      @names	=	@last_name{'Frank',	'Joey'};

           	      @first_names	=	qw(Dean	Sammy	Peter);
           	      @names							=	@last_name{@first_names};


           • Not for one element (warning with -w)
           	      @casinos{$index}		#	WRONG!




Copyright © 2000, O’Reilly  Associates
Variable summary
                                          Scalar context           List context
                            $a                   scalar            list of one element

                           @a              count of elements              array

                         $a[$n]              array element         list of one element

                        @a[@n]            last element of slice         array slice

                           %a                hash statistics      list of key,value pairs

                        $a{$n}               hash element          list of one element

                       @a{@n}             last element of slice         hash slice

Copyright © 2000, O’Reilly  Associates
Control Structures



Copyright © 2000, O’Reilly  Associates
Blocks of code
           • Blocks of code are enclosed by {	}

           • A naked block does not affect program flow

           	      {
           	      code;
           	      code;
           	      more	code;
           	      ...
           	      }




Copyright © 2000, O’Reilly  Associates
if blocks
           • Executes the block of code if the condition is true

           	      if(	$condition	)
           	      	 {
           	      	 #execute	this	block;
           	      	 }

           	      if(	$name	eq	'Frank'	)
           	      	 {
           	      	 print	quot;Hi	Ol'	Blue	Eyes!nquot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates
if, elsif, else
           • Multiple branches of execution

           	      if(	$condition	)
           	      	 {
           	      	 #	if	$condition	is	true
           	      	 }
           	      elsif(	$a_different_condition	)
           	      	 {
           	      	 #	if	$a_different_condition	is	true
           	      	 }
           	      else
           	      	 {
           	      	 #	if	nothing	else
           	      	 }




Copyright © 2000, O’Reilly  Associates                   0
unless
           • Like if, but reverses the sense of the test

           	      unless(	$condition	)
           	      	 {
           	      	 #	if	block	of	code	is	false
           	      	 }


           • Same as

           	      if(	!	$condition	)					#	if(	not	$condition	)


           • Can use 	unless	{}	elsif	{}	else



Copyright © 2000, O’Reilly  Associates
Expression modifiers
           • Single statements can have the conditional
           afterwards

           	      $hit	=	'no'						if	$total	==	17;

           	      $hit	=	'yes'	unless	$total	=	17;

           	      print	quot;My	total	is	$totalnquot;	if	$debug;


           • The modifier is always evaluated first

           • Cannot be chained
           	      $hit	=	'y'	if	$house	if	$total	==	16;		#WRONG



Copyright © 2000, O’Reilly  Associates
“Short circuit” operators
           • Partial evaluation operator, like C, but value is
           the last thing evaluated

           • Logical AND – stops at first false value
           	      17		21				
           	      0			17
           	      16		17		21

           • Logical OR – stops at first true value
           	      0		21
           	      0	||	21
           	      0	||	''	||	undef	||	quot;Hi!quot;

           • Can use the lower precedence and and or
           	      quot;truequot;	and	quot;falsequot;				#	returns	quot;falsequot;
           	      quot;falsequot;	or	quot;truequot;					#	returns	quot;falsequot;	again

Copyright © 2000, O’Reilly  Associates
while  until
           • while() evaluates a block of code until a
           condition is false
           	      while(	$condition	)
           	      	 {
           	      	 #evaluate	while	$condition	is	true
           	      	 }

           • until() reverses the sense of the test
           	      until(	$condition	)
           	      	 {
           	      	 #evaluate	until	$condition	is	true
           	      	 }


           • Both evaluate the condition at least once


Copyright © 2000, O’Reilly  Associates
for
           • Just like C’s for() loop

           	      for(	init;	test;	increment	)
           	      	 {
           	      	 #code
           	      	 }

           	      for(	$i	=	0;	$i		21;	$i++)
           	      	 {
           	      	 print	quot;The	next	number	is	$inquot;;
           	      	 }


           • Any or all of the parts can be omitted
           	      for(;;)	{	...	}



Copyright © 2000, O’Reilly  Associates
foreach
           • Iterates through a list
           • Aliases element to a control variable ($_ by
           default)

           	      foreach(	@casinos	)
           	      	 {
           	      	 print	quot;Play	the	slots	at	$_nquot;;
           	      	 }

           	      foreach	$casino	(	@casinos	)
           	      	 {
           	      	 print	quot;Play	the	slots	at	$itemnquot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates
last
           • last	breaks out of a loop

           	      while(	$condition	)
           	      	 {
           	      	 #code	goes	here...
           	      	 last	if	$other_condition
           	      	 }

           	      foreach	(	@songs	)
           	      	 {
           	      	 last	if	$_	eq	'My	Way';
           	      	 print	quot;Song	is	$_nquot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates
next
           • next	skips to the next iteration

           	      while(	$condition	)
           	      	 {
           	      	 next	unless	$total		17;
           	      	 #code	goes	here...
           	      	 }

           	      foreach	(	@songs	)
           	      	 {	
           	      	 next	unless	$_	ne	'My	Way';
           	      	 print	quot;Song	is	$_nquot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates
redo
           • redo	starts at the top of the loop

           	      while(	$condition	)
           	      	 {
           	      	 #code	goes	here...
           	      	 redo	if	$other_condition
           	      	 }

           • Can be used with a naked block
           	      {
           	      #code	goes	here...
           	      redo	unless	$condition;
           	      }



Copyright © 2000, O’Reilly  Associates
Labeled blocks
           • next, last, and redo work with nested blocks

           • Blocks can be labeled

           SINGER:	foreach	(	@singer	)
           	 {
           	 ...
           	 SONG:	while(	)
           	 	 {
           	 	 ...
           	 	 next	SINGER	if	$condition;
           	 	 }
           	 }




Copyright © 2000, O’Reilly  Associates                     0
Loop control summary
           	
           	      while(	$condition	)
           	      	 {

           	      	     last;		#	jump	out	of	the	loop

           	      	     next;		#	evaluate	next	iteration
           	      	
           	      	     redo;		#	back	to	top	brace

           	      	     }

           	      #	our	program	continues




Copyright © 2000, O’Reilly  Associates
Input / Output



Copyright © 2000, O’Reilly  Associates
Output
           • Send data to standard output
           	      print	quot;Blackjack!nquot;;
           	      print	STDOUT	quot;Blackjack!nquot;	#same	thing


           • print uses $_ by default
                  print;									#	prints	$_
           	      print	STDOUT;		#	same	thing


           • print takes a list argument
                  print	quot;Blackquot;,	quot;jackquot;,	quot;nquot;;
           	      print	quot;I	have	quot;,	10	+	10	+	1,	quot;!nquot;;




Copyright © 2000, O’Reilly  Associates
Formatted output
           • Like print() but with a template string
           	      printf	quot;I	have	%d!nquot;,	10	+	11;
           	      printf	quot;%s	is	playing	at	%snquot;,	$act,	$hotel;


           • Format string is like C's printf
           	      printf	quot;I	won	$%.2f!nquot;,	$winnings;
           	      printf	quot;%20s	%40snquot;,	$name,	$act;


           • Can print to a string too
           	      $str	=	sprintf	quot;I	won	$%.2f!nquot;,	$winnings;


           • See the sprintf documentation



Copyright © 2000, O’Reilly  Associates
STDIN
           • Get the next line of input with STDIN
                  print	quot;Enter	your	name	quot;;
           	      $name	=	STDIN;


           • Line comes with the trailing newline, but you
           can get rid of it with chomp()

           	      chomp(	$name	=	STDIN	);


           • STDIN returns undef at the end of input




Copyright © 2000, O’Reilly  Associates
Looping with input
           • Use a loop to read input
           	      while(	STDIN	)	#	uses	$_	by	default
           	      	 {
           	      	 print	quot;You	entered:	$_quot;;
           	      	 }

           	      while(	defined($_	=	STDIN)	)	#	same	thing
           	
           	      while(	defined($line	=	STDIN)	)
           	      	 {
           	      	 chomp	$line;	#	get	rid	of	the	newline
           	      	 print	quot;You	entered:	$linenquot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates
STDIN as a list
           • In list context, STDIN returns all the lines of
           input at once

           	      @lines	=	STDIN;


           • chomp() works on an array too

           	      chomp(@lines);		#remove	newline	from	each	line




Copyright © 2000, O’Reilly  Associates
Input from files, 
           • Perl can read from files specified on the
           command line with the “diamond operator”

           	      %	perl	script.pl	file1	file2	file3


           • Inside the script, it's the same as reading from
           STDIN

           	      while(		)
           	      	 {
           	      	 print	quot;Saw	line:	$_quot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates
Death
           • Before we go on, we need to talk about die-ing

           • die() causes your program to stop and send an
           error message

           	      die	quot;Oops!quot;	unless	$status;


           • If the error message doesn't end in a newline,
           die() appends the line number

           	      Oops!	at	script_name.pl	line	1.


           • Special variable $! holds the last error message

Copyright © 2000, O’Reilly  Associates
Reading Files
           • open associates a FILEHANDLE	with a file
           	      open	FILE,	quot;filenamequot;;				#	open	for	reading

           • Read just like with STDIN
           	      while(	FILE	)
           	      	 {
           	      	 print	quot;filename:	$_quot;;
           	      	 }


           • Check success of open	
           	      open	FILE,	quot;filenamequot;	
           	      	 or	die	quot;Could	not	open	filename!n$!quot;;

           	      open	(FILE,	quot;filenamequot;)	
           	      	 ||	die	quot;Could	not	open	filename!n$!quot;;



Copyright © 2000, O’Reilly  Associates                          0
Writing files
           • Open a new file, or truncate an existing one
           	      open	FILE,	quot;	filenamequot;;				#	open	for	writing



           • Append data to an existing file
           	      open	FILE,	quot;	filenamequot;;			#	append	data

           • Use print() as before
           	      print		FILE	quot;Blackjack!nquot;;
           	      printf	FILE	quot;%20	stand	at	%dquot;,	$name,	$time;


           • Close files (or rely on autoclose)
           	      close(FILE);




Copyright © 2000, O’Reilly  Associates
Opening pipes to processes
           • Use | at the beginning (think Unix pipelines)

           	      open	MAIL,	quot;|	/usr/lib/sendmail	-tquot;


           • Use print as before

           	      print	MAIL	quot;To:	plawford@example.comnquot;;




Copyright © 2000, O’Reilly  Associates
Pipes from processes
           • Use a | at the end

           	      open	NETSTAT	quot;netstat	|quot;;


           • Read data as before

           	      while(	NETSTAT	)
           	      	 {
           	      	 #	do	stuff	...
           	      	 }




Copyright © 2000, O’Reilly  Associates
Backticks
           • Execute an external program and save the
           output

           	      $lines	=	`ls`;			#	UNIX
           	      $lines	=	`dir`;		#	DOS


           • Works a bit differently in list context – each line
           shows up as a list element

           	      @lines	=	`dir`;




Copyright © 2000, O’Reilly  Associates
system()
           • system runs an external program, but shares
           script's input and output
           	      system	'date';
           	      system	'rm	-rf	*';		#	careful!


           • Can interpolate strings – but be careful
           	      system	quot;rm	-$options	$locationquot;;		#	even	worse


           • What if $location is
           	      '*;	mail	jbishop@example.com		/etc/passwd'


           • List form does not interpret meta-characters
           	      system	'rm',	$options,	$location;




Copyright © 2000, O’Reilly  Associates
Getting help



Copyright © 2000, O’Reilly  Associates
Perl self-help
              • Now that you know a little Perl, it is time to
              learn how to learn more :)

              • Perl comes with hundreds of pages of
              documentation.

              • Perl also comes with a tool to look at the docs
              if they are not installed as manual pages
              	     perldoc	perl


              • On Windows platforms, the docs come in
              HTMLHelp format



Copyright © 2000, O’Reilly  Associates
The manual pages
              • Perl comes with its documentation
              • The perl man page is the table of contents
              	 %	man	perl
              	 perl								Perl	overview	(this	section)
              			
              			perlfaq					Perl	frequently	asked	questions

              			perldata				Perl	data	structures
              			perlsyn					Perl	syntax
              			perlop						Perl	operators	and	precedence
              			perlre						Perl	regular	expressions
              			perlrun					Perl	execution	and	options
              			perlfunc				Perl	builtin	functions
              			perlvar					Perl	predefined	variables
              			perlsub					Perl	subroutines
              			perlmod					Perl	modules:	how	they	work
              		 ...


Copyright © 2000, O’Reilly  Associates
Online help
              •You can also get to the manual pages online
              	     http://www.perl.com
              • Modules and documentation available from
              the Comprehensive Perl Archive Network
              (CPAN)
              	     http://www.cpan.org
              	     http://search.cpan.org
              • Some questions answered at Perlfaq Prime
              	     http://www.perlfaq.com




Copyright © 2000, O’Reilly  Associates
The perlfunc page
              • All of the Perl builtin functions are in perlfunc
              • If you are new to Perl, you should skim over
              this page
              • You do not have to remember everything, but
              at least you will know what is available
              • You can see the information for one function
              using perldoc
              	     perldoc	-f	sprintf
              	     perldoc	-f	open




Copyright © 2000, O’Reilly  Associates                             0
The perlfaq* pages
              • The common questions about Perl are already
              answered
              	     perlfaq	:	Table	of	Contents
              	     perlfaq1:	General	Questions	About	Perl
              	     perlfaq2:	Obtaining	and	Learning	about	Perl
              	     perlfaq3:	Programming	Tools
              	     perlfaq4:	Data	Manipulation
              	     perlfaq5:	Files	and	Formats
              	     perlfaq6:	Regexps
              	     perlfaq7:	General	Perl	Language	Issues
              	     perlfaq8:	System	Interaction
              	     perlfaq9:	Networking


              • Get to them just like any other manual pages
              	     man	perlfaq
              	     perldoc	perlfaq


Copyright © 2000, O’Reilly  Associates
The Camel book
              • Programming Perl is the de facto reference book
              for Perl

              • Larry Wall wrote it, after all, along with Tom
              Christiansen, Perl’s main documenter

              • The third edition, which covers Perl 5.6, was
              just released this summer




Copyright © 2000, O’Reilly  Associates
The Ram book
              • The first Camel book had a section with
              examples and common tasks.

              • This disappeared in the second edition ...

              • ... but reappeared as the Ram book (The Perl
              Cookbook)

              • There are hundreds of recipes along with
              explanations for most common tasks




Copyright © 2000, O’Reilly  Associates
Warnings
              • Perl can give you warnings about questionable
              constructs or problems
              • You can check your script without running it
              	     perl	-cw	script.pl

              • You can turn on warnings inside a script
              	     #!/usr/bin/perl	-w

              • You can get verbose error messages
              	     #!/usr/bin/perl
              	     use	diagnostics;

              • Perl 5.6 has a warnings	pragma
              	     #!/usr/bin/perl
              	     use	warnings;



Copyright © 2000, O’Reilly  Associates
Dealing with errors
              • If you make a syntax mistake in a program,
              there will probably be a cascade of syntax errors

              • Perl will give you the line number of the line
              near the problem

              • Always deal with the first error to appear. A
              lot of the subsequent errors should disappear.




Copyright © 2000, O’Reilly  Associates
use strict
              • The strict pragma forces you to be a careful
              with variable and subroutine names

              • You must declare all variables or make them
              lexical
              	     #!/usr/bin/perl	-w
              	     use	strict;

              	     use	vars	qw(	$singer);

              	     $singer	=	'Frank';	 #	okay	-	pre-declared
              	     my	$way	=	'song';	 #	okay	-	lexical
              	     	$venue	=	'Sands';	 #	WRONG




Copyright © 2000, O’Reilly  Associates
use strict, cont.
              • Perl has “poetry mode”. Barewords are
              considered to be subroutine names
              	     #!/usr/bin/perl	-w
              	     use	strict;

              	     my	$casino	=	Sands;	#	Sands	considered	a	sub


              • The strict pragma turns this off
              	     #!/usr/bin/perl	-w
              	     use	strict;

              	     my	$casino	=	Sands;	 #	okay
              	     my	$casino	=	Sands();	 #	okay
              	     my	$casino	=	Sands;		 #	WRONG!




Copyright © 2000, O’Reilly  Associates
use strict, cont.
              • Declare subroutines before you use them
              	     sub	Sands	{	...	}

              	     my	$casino	=	Sands;


              • Pre-declare subroutines
              	     use	subs	qw(	Sands	);

              	     my	$casino	=	Sands;

              	     sub	Sands	{	...	}




Copyright © 2000, O’Reilly  Associates
Starting off right
              • Anything but a quick ‘n’ dirty script should
              use warnings and strict
              	     #!/usr/bin/perl	-w
              	     use	strict;

              	     use	subs	qw();
              	     use	vars	qw();

              	     ...


              • It is a bit of a pain at first, but you will be a
              better programmer in the long term. :)




Copyright © 2000, O’Reilly  Associates
Regular Expressions



Copyright © 2000, O’Reilly  Associates   0
Regex basics
           • Regular expressions are simply patterns that
           describe part of a string

           • A string either matches or it does not

           • Regex can match anywhere in a string




Copyright © 2000, O’Reilly  Associates
Simple regexes
           • The simplest regex is a single character
           	      a
           	      A


           • A sequence of characters
           	      abc
           	      xyz


           • A period ( . ) will match any character except a
           newline
           	      a.b
           	      x.y




Copyright © 2000, O’Reilly  Associates
Character classes
           • A character class defines a set of characters that
           can match
           	      a[bcd]e	           #	matches	abd	or	ace	or	ade
           	      a[b-y]z	           #	a	range	of	characters
           	      a[t	]b	           #	a	tab	or	a	space
           	      a[0-9]		           #	a	digit


           • Some character classes have shortcuts
           	      d	 	        #	same	as	[0-9]
           	      w	 	        #	[a-zA-Z0-9_]
           	      s	 	        #	[tfnr	]


           • Also
           	      D,	W,	S




Copyright © 2000, O’Reilly  Associates
Anchors
           • Use the caret (^) to match at the beginning of the
           string
           	      ^abc					#	matches	'abc'	but	not	'xyzabc'


           • Use the dollar ($) to match at the end of the
           string
           	      xyz$					#	matches	'xyz'	but	not	'xyzabc'


           • Use the sequence b	to match a “word
           boundary”
           	      Lasb				#	matches	'Las	Vegas'	but	not	'Laser'




Copyright © 2000, O’Reilly  Associates
Repetition
           • Match the repetition of a pattern

           	      a?																			#	zero	or	one	times
           	      a*	 	 	 	 	 	 	#	zero	or	more	times
           	      a+																			#	one	or	more	times
           	      a{2,3}															#	2	or	3	times
           	      a{$min,}													#	at	least	$min	times
           	      a{,$max}													#	at	most	$max	times
           	      ,{5}chameleon								
           	      [a-zA-Z]w{0,254}			#	a	Perl	variable	name


           • Matches are greedy by default – match as much
           as possible




Copyright © 2000, O’Reilly  Associates
Alternation
           • Choose one of several sequences
                  Dean|Dino
           	      Frankie|Frank|Ol'	Blue	Eyes


           • Alternation has a low precendence – use
           parenthesis to group sequences

           	      ^a|b|c
           	      (^a)|b|c			#	same	thing
           	      a|b|c$
           	      a|b|(c$)			#	same	thing			
           	
           	      ^(a|b|c)
           	      (a|b|c)$




Copyright © 2000, O’Reilly  Associates
The match operator
           • Applies regex to a string – $_ by default
           	      	/REGEX/
           	      m/REGEX/		#same	thing


           • Returns true if match succeeds
           	      if(	/REGEX/	)
           	      	 {
           	      	 print	quot;It	matches!nquot;;
           	      	 }


           • The binding operator ( =~ ) applies the match to
           another string
           	      $string	=~	m/REGEX/;



Copyright © 2000, O’Reilly  Associates
More matching
           • The match can be case insensitive
           	      {
           	      print	quot;Do	you	like	Frank	Sinatra?	quot;;
           	      $answer	=	STDIN;
           	      redo	unless	$answer	=~	m/^y/i;
           	      }


           • The match operator does double-quotish
           interpolation (Regex metacharacters are still
           special)
           	      $regex	=	'Dino|Dean';
           	      exit()	if(	/$regex/	);	#	like	m/Dino|Dean/




Copyright © 2000, O’Reilly  Associates
Match variables
           • Parenthesis trigger memory which can be
           accessed later
           	      $_	=	'Dean	Martin';
           	      m/(Dino|Dean)	Martin/;
           	      $first_name	=	$1;


           • Valid until next successful match
           	      m/Sammy/;	#	fails!
           	      print	$1;	#	Still	'Dean';


           • Memory variables often used with substitutions
           (coming up)




Copyright © 2000, O’Reilly  Associates
The substitute operator
           • Use a regex to specify part of a string to replace
           	      s/REGEX/REPLACEMENT/
           	      $_	=	'Frank	Sinatra';
           	      s/Frank/Frankie/;
           	      s/.*(Sinatra)/Chairman	$1/;	#	use	memory
           	      $name	=	'Dean	Martin';
           	      $name	=~	s/ean/ino/;


           • Returns true if replacement is successful
           	      if(	s/Frank/Ol'	Blue	Eyes/	)
           	      	 {
           	      	 print	quot;Do	it	my	way!nquot;;
           	      	 }




Copyright © 2000, O’Reilly  Associates                           00
Affecting s/// behaviour
           • Make all possible substitutions with g flag
           	      s/Dean	Martin/Sammy	Davis,	Jr./g;


           • Make regex part case insensitive with i flag
           	      s/dean	martin/Sammy	Davis,	Jr./i;


           • Let . match newlines with s flag
           	      s//*.**///s;	#	C	comments	(almost)




Copyright © 2000, O’Reilly  Associates                     0
Alternate delimiters
           • “Leaning toothpick syndrome” alleviated by
           alternate delimiters
           	      m//usr/bin/perl/
           	      m#/usr/bin/perl#

           	      s#/usr/bin/perl#/bin/perl#


           • Can use paired delimiters
           	      m(/usr/bin/perl)
           	      m/usr/bin/perl
           	      m{/usr/bin/perl}
           	      m[/usr/bin/perl]

           	      s(/usr/bin/perl){/bin/perl}


Copyright © 2000, O’Reilly  Associates                   0
Functions



Copyright © 2000, O’Reilly  Associates         0
Subroutines
           • Allows code to be reused

           • Named just like variables, and uses the special
           symbol 

           • Defined anywhere in the program

           • Value is last evaluated expression
           	      $card	=	hit_me;

           	      sub	hit_me
           	      	 {
           	      	 int(	rand(11)	);
           	      	 }



Copyright © 2000, O’Reilly  Associates                        0
Return values
           • Return value is last expression evaluated

           	      sub	take_card
           	      	 {
           	      	 if(	$total		17	)	{	'stand'	}
           	      	 else														{	'Hit'	}
           	      	 }

           • Use return	if you like
           	      sub	take_card
           	      	 {
           	      	 ...;
           	      	 return	'Stand'	if	$total		17;
           	      	 }	 	


Copyright © 2000, O’Reilly  Associates                  0
Arguments
           • We can send data to the subroutine
           	      add($x,	$y)


           • Arguments show up in the @_ array
           	      sub	add
           	      	 {
           	      	 ($m,	$n)	=	@_;
           	      	 $m	+	$n;
           	      	 }


           • Each subroutine invocation has it's own @_




Copyright © 2000, O’Reilly  Associates                   0
Local variables
           • All variables are “global” by default
           • You can create “local” versions to hide the global
           versions temporarily
           	      sub	foo
           	      	 {
           	      	 local($x,	$y);
           	      	 ($x,$y)	=	@_;
                        ...
           	      	     }

           	      local	($x,	$y)	=	@_;		#	assign	value	directly


           • Works with all variable types
           	      local(	@array,	%hash	);


Copyright © 2000, O’Reilly  Associates                           0
More local variables
           • Local variables temporarily hide a global value
           	      $name	=	'Frank';
           	      print	quot;Name	is	$namenquot;;	#	'Frank'

           	      $first_name	=	get_name(	'Martin'	);

           	      print	quot;Name	is	$namenquot;;	#	'Frank'

           	      sub	get_name
           	      	 {
           	      	 local	($name)	=	@_;
           	      	 print	quot;Name	is	$namenquot;;	#	'Martin'
           	      	 $first_names{$name};
           	      	 }




Copyright © 2000, O’Reilly  Associates                        0
Lexical variables
           • local works as long as the block has not exited

           • Lexical (“my”) variables only work inside the
           block

           • Lexical variables are faster

           • Special variables cannot be lexical (not yet)
           	      local	$_	=	'Dean	Martin'			#	OKAY
           	      my	$_				=	'Frank	Sinatra'	#	WRONG!!	(warning)




Copyright © 2000, O’Reilly  Associates                            0
More lexical variables
           • Only work inside their scope
           	      $name	=	'Frank';
           	      tell();	#	'Frank'
           	      $first_name	=	get_name(	'Dean'	);
           	      tell();	#	'Frank'

           	      sub	get_name
           	      	 {
           	      	 my	($name)	=	@_;
           	      	 print	quot;$namenquot;;	#	'Dean'
           	      	 tell();	#	leaves	scope	-	'Frank'
           	      	 $first_names{$name};
           	      	 }
           	
           	      sub	tell	{	print	quot;$namenquot;	};




Copyright © 2000, O’Reilly  Associates                 0
Global or lexical?
              • Lexically-scoped variables are preferred

              • The limited scope means that they only affect
              their part of the world.

              • You don’t have to remember all of the variables
              used in the entire program

              • Programs are easier to debug

              • However, lexical variables take up a bit more
              memory


Copyright © 2000, O’Reilly  Associates
Text Manipulation



Copyright © 2000, O’Reilly  Associates
Finding substrings
           • index finds a substring
           	      $pos	=	index	$string,	$substring;


           • Position is zero base and returns -1 if not found
           	      $pos	=	index	quot;Stardustquot;,	quot;Starquot;;		#	$pos	is	0
           	      $pos	=	index	quot;Stardustquot;,	quot;dustquot;;		#	$pos	is	4
           	      $pos	=	index	quot;Stardustquot;,	quot;xorquot;;			#	$pos	is	-1


           • Can start looking at a certain position
           	      $pos	=	index	quot;Stardustquot;,	quot;tquot;,	2;		#starts	at	2
           	      $pos	=	index	quot;Stardustquot;,	quot;tquot;,	$pos	+	1;
           	
           • rindex searches from righthand side
           	      $pos	=	rindex	quot;Stardustquot;,	quot;tquot;;	#	$pos	is	7


Copyright © 2000, O’Reilly  Associates
Extracting substrings
           • substr extracts a substring based on position
           	      $sub_str	=	substr	$string,	$start,	$length

           	      $str	=	substr	quot;Frank	Sinatraquot;,	6,	7;	#	Sinatra
           	      $str	=	substr	quot;Joey	Bishopquot;,	5							#	Bishop


           • Useful with index
           	      $name	=	'Dean	Martin';
           	      $str	=	substr	$name,	index($name,	'M');


           • Can replace strings
           	      substr($name,0,4)	=	'Dino';						#	Dino	Martin
           	      substr($name,0,4)	=~	s/ean/ino/;	#	same	thing	




Copyright © 2000, O’Reilly  Associates
Transliteration
           • tr replaces characters with other characters.
           Uses $_ by default.
           	      tr/a/b/;
           	      tr/ei/ie/;
           	      tr/a-z/n-za-m/;
           	      $other_var	=~	tr/a-z/n-za-m/;


           • Returns the number of characters affected
           	      $count	=	tr/0-9/0-9/;
           	      $count	=	tr/0-9//;	#same	thing


           • Many more things you can do with tr – see the
           documentation



Copyright © 2000, O’Reilly  Associates
split
           • Break a string up according to a regex
           	      @bits	=	split	/REGEX/,	$string;


           • The regex specifies the field delimiter
           	      @names	=	split	/:/,	'Joey:Sammy:Peter';


           • Trailing empty fields are ignored. Leading
           empty fields are retained (as undef)
           	      @names	=	split	/:/,	':::Joey:Sammy:Peter:::';


           • Defaults to splitting $_	on whitespace
           	      @name	=	split;




Copyright © 2000, O’Reilly  Associates
join
           • Like the reverse of split, but does not use a
           regex
           	
           $str	=	join	$separator,	@bits;
           	
           @names	=	split	/:/,	quot;Frank:Dean:Joeyquot;;
           $str	=	join	':',	@names;		#	where	we	started
           $str	=	join	',	',	@name;		#	different	delimiter


           • Can get the glue string at the end

           print	join	quot;nquot;,	@names,	'';




Copyright © 2000, O’Reilly  Associates
Case shifting
           • uc makes everything uppercase, lc, lowercase
           	      uc(quot;Blackjack!quot;);						#'BLACKJACK!'
           	      lc(quot;BLACKJACK!quot;);	 	 #	'blackjack!'


           • ucfirst and lcfirst affect only the first character
           	      $name	=	ucfirst(quot;frankiequot;);		#	'Frankie'
           	      $name	=	lcfirst(quot;Brianquot;);				#	'brian'


           • Can also be done inside the strings
           	      quot;LBLACKJACK!quot;					#	'blackjack!quot;
           	      quot;Ublackjack!quot;					#	'BLACKJACK!quot;
           	      quot;blackujack!quot;					#	'blackJack!quot;
           	      quot;LBLACKEJACK!quot;			#	'blackJACK!'




Copyright © 2000, O’Reilly  Associates
Sorting



Copyright © 2000, O’Reilly  Associates
Simple sorts
           • sort returns a sorted list, leaving the original
           intact
           	      @sorted	=	sort	@array;


           • Sorting is done “ASCIIbetically”

           • Sorting is done in increasing order

           • Numbers are compared as strings
           	      1,	11,	12,	2,	20




Copyright © 2000, O’Reilly  Associates                         0
Advanced sorting
           • You might not want to sort “ASCIIbetically”, but
           you can create your own sorting routine
                  sub	by_numbers
           	      	 {
           	      	 if($a		$b){1}	elsif($a		$b){-1}	else	{0}
           	      	 }

           	      @sorted	=	sort	by_numbers	@values


           • This is so common it has a shorthand (the
           “spaceship” operator)
                  @sorted	=	sort		{	$a	=	$b	}	@values;
           	
           	      @sorted	=	sort		{	$a	cmp	$b	}	@values;	#	ASCII


Copyright © 2000, O’Reilly  Associates
More sorting
           • The sorting routine can be arbitrarily complex
           	 %winnings	=	(	Tropicana	=	5_400,
           																	Stardust		=	3_290,
           																	Luxor					=	6_400,
           																	Sands					=	5,	);
           	 @keys	=	sort	{$winnings{$a}	=	$winnings{$b}}
           	 keys	%winnings;


           • Add a secondary sort
           	      @keys	=	sort
           	      	 {
           	      	 $winnings{$a}	=	$winnings{$b}
           	      	 or
           	      	 $a	cmp	$b
           	      	 }	keys	%winnings;




Copyright © 2000, O’Reilly  Associates
Even more sorting
           • So far the sort order has been ascending

           • reverse	returns the list the other way around
           	      @descending	=	reverse	sort	@list;


           • But you can also sort anyway that you like
           	      @descending	=	sort	{	$b	cmp	$a	}	@list;
           	      @descending	=	sort	{	$b	=	$a	}	@list;




Copyright © 2000, O’Reilly  Associates
An example
            • Let’s sort by a unique key of a flat file database
            #!/usr/bin/perl
            #	key:field1:field2:field3
            open	FILE,	$filename	or	die	quot;$!quot;;

            foreach(	FILE	)
            	 {
            	 chomp;
            	 my	$key	=	(	split	/:/	)[0];
            	 $line{$key}	=	$_;
            	 }

            open	OUT,	quot;	$filename.sortedquot;	or	die	quot;$!quot;;

            foreach(sort	keys	%line)	{	print	quot;$line{$_}nquot;	}




Copyright © 2000, O’Reilly  Associates
A sort subroutine example
           •Let’s sort by IP numbers (this is not the best way
           to do it, by the way)
           	      sub	by_bytes	{			#	192.168.1.1
           	      	 my	($ip_a,	$ip_b)	=	($a,	$b);
           	      	 my	@a	=	split	/./,	$a;
           	      	 my	@b	=	split	/./,	$b;
           	      	 COMPARE:	{
           	      	 	 if(	$a[0]		$b[0]	)	{	return	1	}
           	      	 	 elsif(	$a[0]		$b[0]	)	{	return	-1	}
           	      	 	 else	{
           	      	 	 	 shift	@a;	shift	@b;
           	      	 	 	 last	COMPARE	unless	@a;
           	      	 	 	 redo	COMPARE;
           	      	 	 }
           	      	 }
           	      return	0;
           	      }

Copyright © 2000, O’Reilly  Associates
Sorting IPs, con't
           #!/usr/bin/perl

           chomp(@ips	=	DATA);		#	Take	data	after	__END__
           print	quot;IPs	are	@ipsnquot;;

           foreach(	sort	by_bytes	@ips)
           	 {
           	 print	quot;$_nquot;;
           	 }

           __END__
           199.60.48.64
           166.84.185.32
           209.85.3.25
           208.201.239.50



Copyright © 2000, O’Reilly  Associates
Using modules



Copyright © 2000, O’Reilly  Associates
use and require
           • Perl comes with many libraries and modules

           • require	pulls in external code just as if you
           had typed it into your program

           	      require	quot;chat2.plquot;;


           •use	does the same thing, with an extra import
           step

           	      use	CGI;											#anything	CGI	exports
           	      use	quot;CGI.pmquot;;						#same	thing
           	      use	CGI	qw(:html);	#only	the	:html	stuff




Copyright © 2000, O’Reilly  Associates
Using modules
           • How modules work is beyond the scope of this
           course, but we can still use them.

           • Modules are found at CPAN
           	      http://search.cpan.org


           • Let’s use them to get some work done, though
           	
           	      #import	a	function	from	lib-WWW-Perl	(LWP)
           	      use	LWP::Simple	qw(get);
           	
           	      #fetch	a	web	page
           	      my	$data	=	get(quot;http://www.perl.orgquot;);




Copyright © 2000, O’Reilly  Associates
How to use a module
           • Modules come with documentation

           • Use perldoc
           	      perldoc	Net::FTP


           • On Win32, docs are in HTMLHelp

           • MacPerl uses a program called “Shuck”

           • Let's look at Net::FTP as an example. It's not
           part of the standard distribution. Get it at

           	      http://search.cpan.org/search?module=Net::FTP


Copyright © 2000, O’Reilly  Associates                           0
How to use a module, cont.
           NAME
           					Net::FTP	-	FTP	Client	class

           SYNOPSIS
           									use	Net::FTP;

           									$ftp	=	Net::FTP-new(quot;some.host.namequot;);
           									$ftp-login(quot;anonymousquot;,quot;me@here.comquot;);
           									$ftp-cwd(quot;/pubquot;);
           									$ftp-get(quot;that.filequot;);
           									$ftp-quit;

           DESCRIPTION
           					Net::FTP	is	a	class	implementing	a	simple	FTP	
           client	in	Perl	yadda	yadda	yadda...



Copyright © 2000, O’Reilly  Associates
An example: Net::FTP
           • Suppose we want to download our current work
           schedule

           • Just follow the example!
           	      use	Net::FTP;

           	      my	$ftp	=	new	Net::FTP	'ftp.example.com';

           	      $ftp-login(quot;anonymousquot;,
           	      	 	 	 	 	 quot;plawford@example.comquot;);
           	      $ftp-cwd(quot;/pub/Sandsquot;);
           	      $ftp-get(quot;schedule.docquot;);
           	      $ftp-quit;


           • The file is saved in the current directory
Copyright © 2000, O’Reilly  Associates
Files



Copyright © 2000, O’Reilly  Associates
The stat function
           • stat returns a list of file properties

           ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
           							$atime,$mtime,$ctime,$blksize,$blocks)
           											=	stat($filename);


           • Use a literal slice to get only parts of it

           	      ($mode,$uid,$gid)	=	(	stat($filename)	)[2,4,5]


           • Win32 users see Win32::File (not standard)
           	
           	      use	Win32::File;
           	      Win32::File::GetAttributes(quot;tour.docquot;,	$att)


Copyright © 2000, O’Reilly  Associates
Modify file properties
           • Change file permissions (different for Win32)
           	      chmod	0666,	@file_list;	#	notice	octal	number!


           • Can also use File::chmod
           	      use	File::chmod;
           	      chmod(quot;+xquot;,	@files);

           • Win32 users can use Win32::File
           	      use	Win32::File;
           	      Win32::File::SetAttributes(quot;set.docquot;,	$att);


           • Change timestamp information
           	      utime	$access_time,	$mod_time,	@file_list;


Copyright © 2000, O’Reilly  Associates
Rename, copy, or delete
           • Rename a file
           	      rename	$old_name,	$new_name;


           • Must use file name (not like Unix's mv)
           	      rename	quot;winnings.xlsquot;,	quot;dirquot;;						#WRONG!!
           	      rename	quot;winnings.xlsquot;,	quot;dir/winnings.xlsquot;;


           • Copy a file using File::Copy
           	      use	File::Copy;
           	      copy($original,	$copy);


           • Remove a file
           	      $count	=	unlink	@files;		



Copyright © 2000, O’Reilly  Associates
File::Basename
           • Comes with three functions for manipulating file
           paths – we’ll look at two of them

           • Works with Unix, VMS, Win, and Mac without
           you having to do anything

           	      use	File::Basename;
           	
           	      $dir	=	dirname('C:SystemFooRotBaz');
           	      #	$dir	is	'C:SystemFooRot';
           	
           	      $file	=	basename('/usr/local/lib/perl');
           	      #	$file	is	'perl'




Copyright © 2000, O’Reilly  Associates
File test operators
           • Return true or false for a test against a
           FILEHANDLE or filename
           	      print	quot;Found	a	directory!nquot;	if	-d	$filename;


           • Defaults to the filename in $_
           • Readable, writable, executable: -r,	-w,	-x
           • Exists: -e
           • Plain file, directory, link: -f,	-d,	-l
           • File size: -s returns the file size, in bytes
           	      $size	=	-s	$filename
           • is a tty (terminal): -t
           	      print	quot;We're	interactive!nquot;	if	-t	STDIN;



Copyright © 2000, O’Reilly  Associates
An example
           • Get the five most recently modified files
           #!/usr/bin/perl

           foreach(	*	)
           	 {
           	 next	unless	-f;
           	 $hash{$_}	=	(stat	_)[9];	#	my	$mtime	=	-M;
           	 }

           foreach(
           	 sort	{$hash{$b}	=	$hash{$a}}	keys	%hash	)
           	 {
           	 last	if	$count++		5;
           	 $time	=	localtime($hash{$_});
           	 printf	quot;%-25s	%snquot;,	$_,	$time;
           	 }



Copyright © 2000, O’Reilly  Associates
Directories



Copyright © 2000, O’Reilly  Associates        0
mkdir  rmdir
           • Create a directory
           	      mkdir	$dir_name,	0755	#notice	octal	number
           	      mkdir	$dir_name,	0777	#for	Win32	users


           • Remove a directory (must be empty!)
           	      rmdir	$dir_name;


           • There isn't a Perl-ish way to recursively remove
           directories, so you might have to resort to system
                  system	'rm',	'-r',	$dir_name;




Copyright © 2000, O’Reilly  Associates
The current directory
           • The current working directory decides how to
           resolve relative file paths

           • Cwd	work across platforms
           	      use	Cwd;
           	      $dir	=	cwd();


           • Change to another directory
           	      chdir($dir_name)	or	die	quot;$!quot;;		




Copyright © 2000, O’Reilly  Associates
Globbing
           • Can use the glob operator – *
           • Looks like the “diamond” operator, but isn't

           	      @files	=	*.plx;						#	files	ending	in	.plx
           	      @files	=	*.doc	*.xls


           • There is also a built-in function

           	      @files	=	glob(quot;*.plxquot;);
           	




Copyright © 2000, O’Reilly  Associates
Directory access
           • Directory handles are similar to file handles
           	      opendir(DIR,	$dir)	or	die	quot;$!quot;;


           • Get a list of files from that directory
           	      @files	=	readdir(DIR);


           • Includes . and .. , so you might see
           	      @files	=	grep	!	/^..?$/,	readdir(DIR);


           • Close the directory handle
           	      closedir(DIR);




Copyright © 2000, O’Reilly  Associates
An example
           • Print a sorted list of filenames with file size
           #!/usr/bin/perl

           use	Cwd;

           opendir	DIR,	getcwd()
           	 or	die	quot;Could	not	open	directory!n$!quot;;

           foreach(	sort	readdir	DIR	)
           	 {
           	 next	if	/^./;
           	 next	unless	-f;
           	 printf	quot;%8d	%snquot;,	-s,	$_;
           	 }

           closedir	DIR;



Copyright © 2000, O’Reilly  Associates
Another example
           • Let’s sort by file size though
           #!/usr/bin/perl

           use	Cwd;
           opendir	DIR,	getcwd()
           	 or	die	quot;Could	not	open	directory!n$!quot;;

           foreach(	readdir	DIR	)
           	 {
           	 next	if	/^./	or	not	-f;
           	 $files{$_}	=	-s;
           	 }

           foreach(	sort	{	$files{$a}	=	$files{$b}	}
           	 keys	%files	)	{
           	 printf	quot;%8d	%snquot;,	$files{$_},	$_;	}



Copyright © 2000, O’Reilly  Associates
One - liners



Copyright © 2000, O’Reilly  Associates
Command line scripts
           • Scripts can be executed on the command line

           	      perl	-e	'print	quot;Hello	there!nquot;'

           	      perl	-ne	'print	if	/Perl/'	*

           	      perl	-pe	's/sh/perl/g'	*


           • Complete documentation in perlrun




Copyright © 2000, O’Reilly  Associates
Adding a while() loop
           • -n adds a while loop around your -e script

           	      perl	-n	-e	'print	quot;I	saw:	$_quot;'		file.txt


           same as

           	      #!/usr/bin/perl

           	      while()
           	      	 {
           	      	 print	quot;I	saw:	$_quot;
           	      	 }




Copyright © 2000, O’Reilly  Associates
Even better!
           • -p is like -n, but with a print at the bottom of
           the loop

           	      perl	-p	-e	's/peterbilt/;/g'		file.txt


           same as

           	      #!/usr/bin/perl

           	      while()
           	      	 {
           	      	 s/peterbilt/;/g;
           	      	 print
           	      	 }


Copyright © 2000, O’Reilly  Associates                         0
Editing files in place
           • The -i switch turns on inplace editing
           • Original files are moved, and munged data
           shows up in new files of the same name
           	      perl	-pi.old	-e	's/cM//'	*.txt


           same as
           	      #!/usr/bin/perl
           	      $^I	=	quot;.oldquot;;

           	      while()
           	      	 {
           	      	 s/cM//g;
           	      	 print
           	      	 }




Copyright © 2000, O’Reilly  Associates
Splitting data
           • The -a switch splits the input line into @F
           • Splits on whitespace by default (use	-F to
           specify alternate delimiter)
           	      perl	-ane	'print	quot;$F[2]nquot;'	file.txt


           same as
           	      #!/usr/bin/perl

           	      while(		)
           	      	 {
           	      	 @F	=	split	/s+/,	$_;
           	      	 print	quot;$F[2]nquot;
           	      	 }




Copyright © 2000, O’Reilly  Associates
Conclusion



Copyright © 2000, O’Reilly  Associates
What we did not cover
           • References

           • Complex data structures

           	      $matrix[$x][$y]
           	      $hash{$city}{$title}{$name}


           • Networking and client/server programming

           • Object-oriented programming

           • Much, much more ...


Copyright © 2000, O’Reilly  Associates
What to do next
           • Start writing some Perl scripts
              remember that “baby talk” is okay

           • Read everything about Perl you can, even if you
           do not always understand it

           • Slowly add to your Perl skills

           • Look at modules and scripts for examples




Copyright © 2000, O’Reilly  Associates
Getting Perl support
           • Corporate support packages are available for
           Perl

           • PerlDirect
           	      http://www.perldirect.com


           • The Perl Clinc
           	      http://www.perlclinic.com


           • Free information at www.perl.org and www.
           perl.com



Copyright © 2000, O’Reilly  Associates
References



Copyright © 2000, O’Reilly  Associates
Books
           Learning Perl, Randal L. Schwartz and Tom
           Christiansen

           Learning Perl on Win32, Randal L. Schwartz, Tom
           Christiansen, and Eric Olsen

           Programming Perl, Larry Wall, Tom Christiansen,
           and Jon Orwant

           Effective Perl Programming, Joseph Hall and Randal
           L. Schwartz



Copyright © 2000, O’Reilly  Associates
Online Resources
           The Perl Language Pages
           	      http://www.perl.com


           Perl Mongers
           	      http://www.perlmongers.org


           Perl user groups
           	      http://www.pm.org


           Comprehensive Perl Archive Network
           	      http://www.cpan.org




Copyright © 2000, O’Reilly  Associates

More Related Content

What's hot (20)

Concept of genomics, proteomics and metabolomics
Concept of genomics, proteomics and metabolomicsConcept of genomics, proteomics and metabolomics
Concept of genomics, proteomics and metabolomics
 
Nuclear Genomes(Short Answers and questions)
Nuclear Genomes(Short Answers and questions)Nuclear Genomes(Short Answers and questions)
Nuclear Genomes(Short Answers and questions)
 
RNAseq Analysis
RNAseq AnalysisRNAseq Analysis
RNAseq Analysis
 
Perl Introduction
Perl IntroductionPerl Introduction
Perl Introduction
 
Gene expresion
Gene expresionGene expresion
Gene expresion
 
Biopython
BiopythonBiopython
Biopython
 
I- Tasser
I- TasserI- Tasser
I- Tasser
 
Biological sequences analysis
Biological sequences analysisBiological sequences analysis
Biological sequences analysis
 
Bioinformatics.Practical Notebook
Bioinformatics.Practical NotebookBioinformatics.Practical Notebook
Bioinformatics.Practical Notebook
 
Intro to Perl and Bioperl
Intro to Perl and BioperlIntro to Perl and Bioperl
Intro to Perl and Bioperl
 
Perl
PerlPerl
Perl
 
Lect4 software economics
Lect4 software economicsLect4 software economics
Lect4 software economics
 
Protein structure prediction (1)
Protein structure prediction (1)Protein structure prediction (1)
Protein structure prediction (1)
 
Unit 1-array,lists and hashes
Unit 1-array,lists and hashesUnit 1-array,lists and hashes
Unit 1-array,lists and hashes
 
Function & procedure
Function & procedureFunction & procedure
Function & procedure
 
Modular programming
Modular programmingModular programming
Modular programming
 
LISP: Data types in lisp
LISP: Data types in lispLISP: Data types in lisp
LISP: Data types in lisp
 
Mitochondrial Genome.pptx
Mitochondrial Genome.pptxMitochondrial Genome.pptx
Mitochondrial Genome.pptx
 
Functional annotation- prediction of genes.pptx
Functional annotation- prediction of genes.pptxFunctional annotation- prediction of genes.pptx
Functional annotation- prediction of genes.pptx
 
Python programming : Exceptions
Python programming : ExceptionsPython programming : Exceptions
Python programming : Exceptions
 

Similar to Perl University: Getting Started with Perl

Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory CourseRuby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Coursepeter_marklund
 
Rails and Legacy Databases - RailsConf 2009
Rails and Legacy Databases - RailsConf 2009Rails and Legacy Databases - RailsConf 2009
Rails and Legacy Databases - RailsConf 2009Brian Hogan
 
When To Use Ruby On Rails
When To Use Ruby On RailsWhen To Use Ruby On Rails
When To Use Ruby On Railsdosire
 
DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)dpc
 
Oop Overview
Oop OverviewOop Overview
Oop Overviewphananhvu
 
ruote stockholm 2008
ruote stockholm 2008ruote stockholm 2008
ruote stockholm 2008John Mettraux
 
Php Crash Course - Macq Electronique 2010
Php Crash Course - Macq Electronique 2010Php Crash Course - Macq Electronique 2010
Php Crash Course - Macq Electronique 2010Michelangelo van Dam
 
Employing Custom Fonts
Employing Custom FontsEmploying Custom Fonts
Employing Custom FontsPaul Irish
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceJesse Vincent
 
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)Alex Balhatchet
 
Les Tests avec Ruby on Rails et RSpec (in French)
Les Tests avec Ruby on Rails et RSpec (in French)Les Tests avec Ruby on Rails et RSpec (in French)
Les Tests avec Ruby on Rails et RSpec (in French)Jean-Michel Garnier
 
API's, Freebase, and the Collaborative Semantic web
API's, Freebase, and the Collaborative Semantic webAPI's, Freebase, and the Collaborative Semantic web
API's, Freebase, and the Collaborative Semantic webDan Delany
 
javascript teach
javascript teachjavascript teach
javascript teachguest3732fa
 

Similar to Perl University: Getting Started with Perl (20)

Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory CourseRuby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
 
Rails and Legacy Databases - RailsConf 2009
Rails and Legacy Databases - RailsConf 2009Rails and Legacy Databases - RailsConf 2009
Rails and Legacy Databases - RailsConf 2009
 
When To Use Ruby On Rails
When To Use Ruby On RailsWhen To Use Ruby On Rails
When To Use Ruby On Rails
 
DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)DPC2007 PDO (Lukas Kahwe Smith)
DPC2007 PDO (Lukas Kahwe Smith)
 
Oop Overview
Oop OverviewOop Overview
Oop Overview
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
ruote stockholm 2008
ruote stockholm 2008ruote stockholm 2008
ruote stockholm 2008
 
Php Crash Course - Macq Electronique 2010
Php Crash Course - Macq Electronique 2010Php Crash Course - Macq Electronique 2010
Php Crash Course - Macq Electronique 2010
 
Employing Custom Fonts
Employing Custom FontsEmploying Custom Fonts
Employing Custom Fonts
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret Sauce
 
Preon (J-Fall 2008)
Preon (J-Fall 2008)Preon (J-Fall 2008)
Preon (J-Fall 2008)
 
Api Design
Api DesignApi Design
Api Design
 
Intro to Perl
Intro to PerlIntro to Perl
Intro to Perl
 
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
Introduction to Writing Readable and Maintainable Perl (YAPC::EU 2011 Version)
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 
Practical Groovy DSL
Practical Groovy DSLPractical Groovy DSL
Practical Groovy DSL
 
Les Tests avec Ruby on Rails et RSpec (in French)
Les Tests avec Ruby on Rails et RSpec (in French)Les Tests avec Ruby on Rails et RSpec (in French)
Les Tests avec Ruby on Rails et RSpec (in French)
 
Amoocon May 2009 Germany
Amoocon May 2009   GermanyAmoocon May 2009   Germany
Amoocon May 2009 Germany
 
API's, Freebase, and the Collaborative Semantic web
API's, Freebase, and the Collaborative Semantic webAPI's, Freebase, and the Collaborative Semantic web
API's, Freebase, and the Collaborative Semantic web
 
javascript teach
javascript teachjavascript teach
javascript teach
 

More from brian d foy

Conferences for Beginners presentation
Conferences for Beginners presentationConferences for Beginners presentation
Conferences for Beginners presentationbrian d foy
 
20 years in Perl
20 years in Perl20 years in Perl
20 years in Perlbrian d foy
 
PrettyDump Perl 6 (London.pm)
PrettyDump Perl 6 (London.pm)PrettyDump Perl 6 (London.pm)
PrettyDump Perl 6 (London.pm)brian d foy
 
Dumping Perl 6 (French Perl Workshop)
Dumping Perl 6 (French Perl Workshop)Dumping Perl 6 (French Perl Workshop)
Dumping Perl 6 (French Perl Workshop)brian d foy
 
Perl v5.26 Features (AmsterdamX.pm)
Perl v5.26 Features (AmsterdamX.pm)Perl v5.26 Features (AmsterdamX.pm)
Perl v5.26 Features (AmsterdamX.pm)brian d foy
 
Dumping Perl 6 (AmsterdamX.pm)
Dumping Perl 6 (AmsterdamX.pm)Dumping Perl 6 (AmsterdamX.pm)
Dumping Perl 6 (AmsterdamX.pm)brian d foy
 
6 more things about Perl 6
6 more things about Perl 66 more things about Perl 6
6 more things about Perl 6brian d foy
 
6 things about perl 6
6 things about perl 66 things about perl 6
6 things about perl 6brian d foy
 
Perl 5.28 new features
Perl 5.28 new featuresPerl 5.28 new features
Perl 5.28 new featuresbrian d foy
 
The Surprisingly Tense History of the Schwartzian Transform
The Surprisingly Tense History of the Schwartzian TransformThe Surprisingly Tense History of the Schwartzian Transform
The Surprisingly Tense History of the Schwartzian Transformbrian d foy
 
Perl Power Tools - Saint Perl 6
Perl Power Tools - Saint Perl 6Perl Power Tools - Saint Perl 6
Perl Power Tools - Saint Perl 6brian d foy
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongersbrian d foy
 
The Whitespace in the Perl Community
The Whitespace in the Perl CommunityThe Whitespace in the Perl Community
The Whitespace in the Perl Communitybrian d foy
 
CPAN Workshop, Chicago 2014
CPAN Workshop, Chicago 2014CPAN Workshop, Chicago 2014
CPAN Workshop, Chicago 2014brian d foy
 
Parsing JSON with a single regex
Parsing JSON with a single regexParsing JSON with a single regex
Parsing JSON with a single regexbrian d foy
 
Reverse Installing CPAN
Reverse Installing CPANReverse Installing CPAN
Reverse Installing CPANbrian d foy
 
Advanced modulinos
Advanced modulinosAdvanced modulinos
Advanced modulinosbrian d foy
 
Advanced modulinos trial
Advanced modulinos trialAdvanced modulinos trial
Advanced modulinos trialbrian d foy
 

More from brian d foy (20)

Conferences for Beginners presentation
Conferences for Beginners presentationConferences for Beginners presentation
Conferences for Beginners presentation
 
20 years in Perl
20 years in Perl20 years in Perl
20 years in Perl
 
PrettyDump Perl 6 (London.pm)
PrettyDump Perl 6 (London.pm)PrettyDump Perl 6 (London.pm)
PrettyDump Perl 6 (London.pm)
 
Dumping Perl 6 (French Perl Workshop)
Dumping Perl 6 (French Perl Workshop)Dumping Perl 6 (French Perl Workshop)
Dumping Perl 6 (French Perl Workshop)
 
Perl v5.26 Features (AmsterdamX.pm)
Perl v5.26 Features (AmsterdamX.pm)Perl v5.26 Features (AmsterdamX.pm)
Perl v5.26 Features (AmsterdamX.pm)
 
Dumping Perl 6 (AmsterdamX.pm)
Dumping Perl 6 (AmsterdamX.pm)Dumping Perl 6 (AmsterdamX.pm)
Dumping Perl 6 (AmsterdamX.pm)
 
6 more things about Perl 6
6 more things about Perl 66 more things about Perl 6
6 more things about Perl 6
 
6 things about perl 6
6 things about perl 66 things about perl 6
6 things about perl 6
 
Perl 5.28 new features
Perl 5.28 new featuresPerl 5.28 new features
Perl 5.28 new features
 
The Surprisingly Tense History of the Schwartzian Transform
The Surprisingly Tense History of the Schwartzian TransformThe Surprisingly Tense History of the Schwartzian Transform
The Surprisingly Tense History of the Schwartzian Transform
 
Perl Power Tools - Saint Perl 6
Perl Power Tools - Saint Perl 6Perl Power Tools - Saint Perl 6
Perl Power Tools - Saint Perl 6
 
Perl Bag of Tricks - Baltimore Perl mongers
Perl Bag of Tricks  -  Baltimore Perl mongersPerl Bag of Tricks  -  Baltimore Perl mongers
Perl Bag of Tricks - Baltimore Perl mongers
 
The Whitespace in the Perl Community
The Whitespace in the Perl CommunityThe Whitespace in the Perl Community
The Whitespace in the Perl Community
 
CPAN Workshop, Chicago 2014
CPAN Workshop, Chicago 2014CPAN Workshop, Chicago 2014
CPAN Workshop, Chicago 2014
 
Parsing JSON with a single regex
Parsing JSON with a single regexParsing JSON with a single regex
Parsing JSON with a single regex
 
Reverse Installing CPAN
Reverse Installing CPANReverse Installing CPAN
Reverse Installing CPAN
 
Advanced modulinos
Advanced modulinosAdvanced modulinos
Advanced modulinos
 
Advanced modulinos trial
Advanced modulinos trialAdvanced modulinos trial
Advanced modulinos trial
 
Bag of tricks
Bag of tricksBag of tricks
Bag of tricks
 
I ❤ CPAN
I ❤ CPANI ❤ CPAN
I ❤ CPAN
 

Recently uploaded

Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding TeamAdam Moalla
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
VoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXVoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXTarek Kalaji
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 

Recently uploaded (20)

Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
VoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBXVoIP Service and Marketing using Odoo and Asterisk PBX
VoIP Service and Marketing using Odoo and Asterisk PBX
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 

Perl University: Getting Started with Perl

  • 1. Getting Started with Perl University of Perl, October 2000 brian d foy http://www.pair.com/~comdog/Talks/perl_university.pdf v3.6.7.4 Copyright © 2000, O’Reilly & Associates
  • 2. Introduction Copyright © 2000, O’Reilly Associates
  • 3. About this talk • Perl has over 1,000 pages of printed documentation. • This talk is only two days – a brief tour of Perl • Some things will not be the whole truth to simplify things • Remember you have heard about this stuff, then refer to the notes and references later. Copyright © 2000, O’Reilly Associates
  • 4. What is Perl? • General purpose programming language Databases, networking, system interaction, ... • High level programming language • The best things from C, awk, sed, and many other languages • “The duct tape of the internet” – Hassan Schroeder • A mix of object oriented and procedural styles Copyright © 2000, O’Reilly Associates
  • 5. Why use Perl? • Rapid prototyping • Compact – faster to write and shorter to debug • Memory management and other mundane tasks handled automatically • Portable – Unix, Windows, Mac, OS/2 • Maximum expressivity Copyright © 2000, O’Reilly Associates
  • 6. Understanding Perl • To understand Perl, understand its creator linguistics, computer science, and a lot more • Easy things should be easy, and hard things should be possible • The problem space is messy, so one needs a messy language • There’s more than one way to do it (TMTOWTDI) • You do not have to know everything (“baby talk” is officially okay) Copyright © 2000, O’Reilly Associates
  • 7. Brief history of Perl • Perl 1.0 was released in 1987 – before the Web! • Released to Net, which suggested changes (and changes, and changes, and ... ) • The “camel” book is published – Programming perl; and Perl 4 is released • Perl 5.0 was released in 1994 extensible design third party modules references complex data structures object oriented features • For the most complete Perl history: http://history.perl.org Copyright © 2000, O’Reilly Associates
  • 8. Getting Perl • Latest version is Perl 5.6.0 • Comprehensive Perl Archive Network (CPAN) http://www.cpan.org and http://search.cpan.org • Source is available at http://www.cpan.org/src/index.html • Linux, Solaris, and Win NT versions available from ActiveState http://www.activestate.com • Some operating systems may already have Perl http://www.perl.org/phbs/vendors.html • Other operating system versions available at http://www.cpan.org/ports/index.html Copyright © 2000, O’Reilly Associates
  • 9. Finding Perl information • Perl man pages (1000+ pages of printed docs!) man perl perldoc perl perldoc -f function • Available as HTMLHelp on Win32 • Perldoc.com http://www.perldoc.com • Comprehensive Perl Archive Network (CPAN) http://www.cpan.org, http://search.cpan.org • The Perl Language Page http://www.perl.com • Perl Mongers http://www.perl.org Copyright © 2000, O’Reilly Associates
  • 10. Perl program basics • Scripts are just text files – use any text editor • Syntax is like C (mostly) whitespace is insignificant statements end in semicolons • Comments are from # to end of line print quot;Viva Las Vegasnquot;; #this is a comment • Variables do not need to be declared • The perl interpreter compiles and runs script Copyright © 2000, O’Reilly Associates 0
  • 11. Perl scripts • First line is the “shebang” line #!/usr/bin/perl #!/usr/bin/perl -w • Can also run from the command line perl script.pl perl -w script.pl perl -cw script.pl • See the perlrun man page for more command- line switches Copyright © 2000, O’Reilly Associates
  • 12. Script example • As a text file #!/usr/bin/perl -w my( $date ) = ( localtime )[3]; print quot;Today is $datenquot;; • On the command line ( a “one-liner” ) # Sands:Keno:4000 perl -naF: -e 'print $F[2]' input_file Copyright © 2000, O’Reilly Associates
  • 13. Data Copyright © 2000, O’Reilly Associates
  • 14. Scalar data • Literal data are either scalars or lists • A scalar is a single value • Scalars are either strings or numbers • Strings are sequences of characters 'Dino', '5', 'Chairman', '' • Numbers can be expressed in many forms 42, 3.14e7, 6.022E23, 0xFF, 0377, -2 • Perl switches between numbers and strings as needed Copyright © 2000, O’Reilly Associates
  • 15. Numbers • Numbers are computed with double-precision • One of few problems where the underlying architecture shows through • Can be written in many ways – embedded underscores are ignored 4294967295 4_294_967_295 0xFFFFFFFF 0xFF_FF_FF_FF 0b1111_1111_1111_1111 #needs 5.6! Copyright © 2000, O’Reilly Associates
  • 16. Numeric operators • Arithmetic 4 + 5 5 - 4 3 * 6 6 / 3 • Exponentiation 3 ** 2 2 ** (-3) (-1) ** 5 # no complex numbers though! • Modulus 17 % 2 Copyright © 2000, O’Reilly Associates
  • 17. Precedence associativity • Just like C (or high school algebra) • Each operation has a precedence 1 + 2 * 10 # 21, not 30 (bust!) 1 + (2 * 10) # same thing (1 + 2) * 10 # 30 2**2**3 # 256, not 64 2**(2**3) # same thing (2**2)**3 # 64 • See the perlop man page for details Copyright © 2000, O’Reilly Associates
  • 18. Numeric comparisons • What is truth? (that's a different course!) false – 0, '', undef true – everything else 42 65 # less than, TRUE 65 42 # greater than, TRUE 65 == 65 # equals, TRUE 4 == 3 # equals, FALSE 4 != 3 # not equals, TRUE 2 = 3 # less than or equal, TRUE 3 = 4 # greater than or equal, FALSE • Negation ! 25 # not, FALSE! not 25 # same as ! 25 Copyright © 2000, O’Reilly Associates
  • 19. Strings • Single quoted strings are as-is 'This is a string' 'I'm in Las Vegas' q|I'm in Las Vegas| #generalized single quotes • Double-quoted strings allow for special sequences quot;This line has a newlinenquot; # n is newline quot;A tabtin the middlequot; # t is tab quot;He said quot;Foo!quot;quot; #generalized double quotes qq|He sings quot;My Wayquot;n|; Copyright © 2000, O’Reilly Associates
  • 20. String operators • Concatenation – the . operator 'Hello ' . 'World!' # 'Hello World!' 'Dean' . ' ' . 'Martin' # 'Dean Martin' • Replication – the x operator 'Hello ' x 3 # 'Hello Hello Hello ' • Generalized quoting q|Dean Martin's favorite drink| q(Dean Martin's favorite drink) qq|Sinatra sings quot;$song_namequot;| Copyright © 2000, O’Reilly Associates 0
  • 21. String comparisons • Uses FORTRAN-like operators • Compares quot;ASCIIbeticallyquot;, not alphabetically 'Peter' gt 'Joey' # greater than, TRUE 'Sammy' lt 'Dean' # less than, FALSE 'Frank' eq 'frank' # equals, FALSE 'Frank' ne 'Peter' # not equals, TRUE 'Frank' ge 'Dean' # greater or equal, TRUE 'Frank' le 'Joey' # lesser or equal, TRUE '2' gt '10' # TRUE Copyright © 2000, O’Reilly Associates
  • 22. Numbers or strings? • Remember that Perl has scalars – either a number or a string • Perl figures out what to do based on context • Context is determined by the type of operation • Strings are converted to numbers ignoring everything after first non-digit quot;1234 My Wayquot; becomes 1234 5 + quot;1234 My Wayquot; becomes 1239 • Numbers are converted to strings '$' . (102/5); # becomes '$20.4' Copyright © 2000, O’Reilly Associates
  • 23. List data • Lists are collections of scalars • List elements are indexed by numbers, starting at 0 (zero), like C. • Lists are created by using parentheses ('Sinatra', 'Martin', 'Lawford') qw( Sinatra Martin Lawford ) #Quote Words ( 0 .. 9 ) # the range operator, .. Copyright © 2000, O’Reilly Associates
  • 24. List Slice • Used to get part of a list ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')[1,2] • Negative numbers count from end ('Mon', 'Tue', 'Wed', 'Thu', 'Fri')[0,-1] • Useful with some funtions that return lists ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isd st) = localtime(); ($mon, $mday, $year) = ( localtime() )[4,3,5] Copyright © 2000, O’Reilly Associates
  • 25. Variables Copyright © 2000, O’Reilly Associates
  • 26. Variable basics • No need to declare variables • Variables spring into existence when used • Perl handles the rest • Names start with a letter, followed by zero or more letters, digits, or underscores • Names are case sensitive • Names are preceded by a special character ($, @, %) to denote the variable type • Perl special variables (“punctuation variables”) start with non-letters – $_, $quot;, $/ Copyright © 2000, O’Reilly Associates
  • 27. Scalars • A scalar variable holds a single value – either a string or a number. • Scalar variable names start with a $ (looks like “S” for “scalar”) $hotel $casino $playing_tonight_at_the_Sands $string_01 $*strip # WRONG! $2vegas # WRONG! Copyright © 2000, O’Reilly Associates
  • 28. Scalar assignment • The assignment operator is = $name = quot;Frank Sinatraquot;; $title = 'Chairman of the Board'; • Can be used to copy data $nickname = $title; • Scalars can be interpolated into strings print quot;Tonight's act is $namenquot;; outputs: Tonight's act is Frank Sinatra Copyright © 2000, O’Reilly Associates
  • 29. Controlling interpolation • To prevent interpolation, escape the $ $brag = quot;I won $5,000 dollars at the slots!quot;; • You can use single quotes if you don't want interpolation $brag = 'I won $5,000 dollars at the slots!'; • Perl looks for the longest possible variable name $game = 'Blackjack'; $say = quot;Hello $gameersquot;; #Hello ! $say = quot;Hello ${game}ersquot;; #Hello Blackjackers! $say = quot;Hello $gamequot; . quot;ersquot;; Copyright © 2000, O’Reilly Associates
  • 30. Arrays • An array holds a list • No pre-defined size or bounds • Array variable names start with a @ @hotels @casinos @A_very_long_list_of_all_of_the_good_slots • @hotels has nothing to do with $hotels Copyright © 2000, O’Reilly Associates 0
  • 31. Array indices • Arrays are indexed by integers, starting at zero Frank Sammy Peter Joey Dean 0 1 2 3 4 • Can use negative integers to count from end of list Copyright © 2000, O’Reilly Associates
  • 32. Array assignment • Assign a list to an array @hotels = ('Sands', 'MGM', 'Luxor'); @hotels = qw( Sands MGM Luxor ); • Copy arrays @casinos = @hotels; • Arrays can be interpolated into strings print quot;Casinos: are @casinosnquot;; outputs: Casinos: are Sands MGM Luxor • Assigning an array to a scalar gives a count $n = @casinos; # $n is 3 Copyright © 2000, O’Reilly Associates
  • 33. More array assignment • Assign to a list ($x, $y, $z) = @casinos; • Arrays on left hand side are greedy ($x, @y) = @casinos; ($x, @y, $z) = @casinos; # $z gets nothing Copyright © 2000, O’Reilly Associates
  • 34. Array element access • Use array name followed by index in [ ] @casinos = ('Sands', 'MGM', 'Luxor'); $casinos[2]; $casinos[$index]; $casinos[$index + 1]; • Indices are converted to integers $casinos[2.25]; # turns into $casinos[2] • Accessing past bounds gives undef @casinos = qw( Sands MGM Luxor ); $casino = $casinos[3]; # UNDEF! Copyright © 2000, O’Reilly Associates
  • 35. Array element assignment • Work with array element directly $casinos[3] = 'MGM Grand'; • Assigning past bounds fills in elements with undef $casinos[20] = 'Stardust'; # 4 - 19 get undef • $#array_name is the index of the last element print quot;The last index is $#casinosnquot;; # add element $casinos[ $#casinos + 1 ] = 'Showboat'; Copyright © 2000, O’Reilly Associates
  • 36. Array slices • Array slices are like list slices • Variable name followed by indices in [ ] • Preceded by @ (because it is a list) ($x, $y, $z) = @casinos[1,5,6]; @indices = (1, 5, 6); ($x, $y, $z) = @casinos[@indices]; • Not for one element (warning with -w) @casinos[$index] # WRONG! WRONG! WRONG! Copyright © 2000, O’Reilly Associates
  • 37. List operators • shift removes the first element @num = 4 .. 7; $first = shift @num; # @num is ( 5..7 ) • unshift adds onto the head of the list unshift @num, $first; # @num is ( 4 .. 7 ) unshift @num, 1 .. 3; # @num is ( 1 .. 7 ) • push and pop do the same thing on the tail of the list $last = pop @num; # @num is ( 1 .. 6 ) push @num, $last, 8, 9; # @num is ( 1 .. 9 ) Copyright © 2000, O’Reilly Associates
  • 38. Scalar vs. list context • Perl decides what to do based on context $hotel = quot;Stardustquot;; @hotel = quot;Stardustquot;; # list of one element $hotel = @hotels; # $hotel get a count • Some functions behave differently @time = localtime; # like we saw before $time = localtime; # Fri Sep 24 14:37:21 1999 • There is no general rule for converting a list to a scalar Copyright © 2000, O’Reilly Associates
  • 39. There is no general rule for converting a list to a scalar Copyright © 2000, O’Reilly Associates
  • 40. Hashes • Used to be called “associative arrays” (Perl 4) • Like arrays, but index is a unique string • Hash variable names start with a % %hotels %games %all_the_games_to_which_i_lost_money • Stored in an efficient fashion behind the scenes • %hotels has nothing to do with @hotels or $hotels Copyright © 2000, O’Reilly Associates 0
  • 41. More on hashes • Use a hash to map some data (“keys”) onto other data (“values”) • Keys have to be unique Keys Frank Dean Sammy Joey Peter Values Sinatra Martin Davis, Jr. Bishop Lawford Copyright © 2000, O’Reilly Associates
  • 42. Hash assignment • Assign a list, in key-value order %hash = ('key1', 'value1', 'key2', 'value2' ); %hash = ( key1 = 'value1', key2 = 'value2'); %hash = ( key1 = 'value1', key2 = 'value2', ); • Copy hashes %casinos = %hotels; • Get list back (in no particular order!) @as_list = %hotels; Copyright © 2000, O’Reilly Associates
  • 43. Hash element access • Use hash name followed by index in { } $last_name{'Joey'} $last_name{$name} $last_name{'Jo' . 'ey'} • Accessing an undefined index creates it $name{'Chairman'} = 'Frank'; • Check to see if a key exists. $exists = exists $name{'Bobby'}; • If key does not exist, exists does not create it. • Check to see if a value is defined $defined = defined $name{'Dino'}; Copyright © 2000, O’Reilly Associates
  • 44. Hash operators • Get a list of all of the keys (in no particular order) @keys = keys %hash; • Get a list of corresponding values @values = keys %hash; • Get the next key-value pair ($key, $value) = each %hash; Copyright © 2000, O’Reilly Associates
  • 45. Hash slices • Variable name followed by indices in { } • Preceded by @ (because it is a list) @names = @last_name{'Frank', 'Joey'}; @first_names = qw(Dean Sammy Peter); @names = @last_name{@first_names}; • Not for one element (warning with -w) @casinos{$index} # WRONG! Copyright © 2000, O’Reilly Associates
  • 46. Variable summary Scalar context List context $a scalar list of one element @a count of elements array $a[$n] array element list of one element @a[@n] last element of slice array slice %a hash statistics list of key,value pairs $a{$n} hash element list of one element @a{@n} last element of slice hash slice Copyright © 2000, O’Reilly Associates
  • 47. Control Structures Copyright © 2000, O’Reilly Associates
  • 48. Blocks of code • Blocks of code are enclosed by { } • A naked block does not affect program flow { code; code; more code; ... } Copyright © 2000, O’Reilly Associates
  • 49. if blocks • Executes the block of code if the condition is true if( $condition ) { #execute this block; } if( $name eq 'Frank' ) { print quot;Hi Ol' Blue Eyes!nquot;; } Copyright © 2000, O’Reilly Associates
  • 50. if, elsif, else • Multiple branches of execution if( $condition ) { # if $condition is true } elsif( $a_different_condition ) { # if $a_different_condition is true } else { # if nothing else } Copyright © 2000, O’Reilly Associates 0
  • 51. unless • Like if, but reverses the sense of the test unless( $condition ) { # if block of code is false } • Same as if( ! $condition ) # if( not $condition ) • Can use unless {} elsif {} else Copyright © 2000, O’Reilly Associates
  • 52. Expression modifiers • Single statements can have the conditional afterwards $hit = 'no' if $total == 17; $hit = 'yes' unless $total = 17; print quot;My total is $totalnquot; if $debug; • The modifier is always evaluated first • Cannot be chained $hit = 'y' if $house if $total == 16; #WRONG Copyright © 2000, O’Reilly Associates
  • 53. “Short circuit” operators • Partial evaluation operator, like C, but value is the last thing evaluated • Logical AND – stops at first false value 17 21 0 17 16 17 21 • Logical OR – stops at first true value 0 21 0 || 21 0 || '' || undef || quot;Hi!quot; • Can use the lower precedence and and or quot;truequot; and quot;falsequot; # returns quot;falsequot; quot;falsequot; or quot;truequot; # returns quot;falsequot; again Copyright © 2000, O’Reilly Associates
  • 54. while until • while() evaluates a block of code until a condition is false while( $condition ) { #evaluate while $condition is true } • until() reverses the sense of the test until( $condition ) { #evaluate until $condition is true } • Both evaluate the condition at least once Copyright © 2000, O’Reilly Associates
  • 55. for • Just like C’s for() loop for( init; test; increment ) { #code } for( $i = 0; $i 21; $i++) { print quot;The next number is $inquot;; } • Any or all of the parts can be omitted for(;;) { ... } Copyright © 2000, O’Reilly Associates
  • 56. foreach • Iterates through a list • Aliases element to a control variable ($_ by default) foreach( @casinos ) { print quot;Play the slots at $_nquot;; } foreach $casino ( @casinos ) { print quot;Play the slots at $itemnquot;; } Copyright © 2000, O’Reilly Associates
  • 57. last • last breaks out of a loop while( $condition ) { #code goes here... last if $other_condition } foreach ( @songs ) { last if $_ eq 'My Way'; print quot;Song is $_nquot;; } Copyright © 2000, O’Reilly Associates
  • 58. next • next skips to the next iteration while( $condition ) { next unless $total 17; #code goes here... } foreach ( @songs ) { next unless $_ ne 'My Way'; print quot;Song is $_nquot;; } Copyright © 2000, O’Reilly Associates
  • 59. redo • redo starts at the top of the loop while( $condition ) { #code goes here... redo if $other_condition } • Can be used with a naked block { #code goes here... redo unless $condition; } Copyright © 2000, O’Reilly Associates
  • 60. Labeled blocks • next, last, and redo work with nested blocks • Blocks can be labeled SINGER: foreach ( @singer ) { ... SONG: while( ) { ... next SINGER if $condition; } } Copyright © 2000, O’Reilly Associates 0
  • 61. Loop control summary while( $condition ) { last; # jump out of the loop next; # evaluate next iteration redo; # back to top brace } # our program continues Copyright © 2000, O’Reilly Associates
  • 62. Input / Output Copyright © 2000, O’Reilly Associates
  • 63. Output • Send data to standard output print quot;Blackjack!nquot;; print STDOUT quot;Blackjack!nquot; #same thing • print uses $_ by default print; # prints $_ print STDOUT; # same thing • print takes a list argument print quot;Blackquot;, quot;jackquot;, quot;nquot;; print quot;I have quot;, 10 + 10 + 1, quot;!nquot;; Copyright © 2000, O’Reilly Associates
  • 64. Formatted output • Like print() but with a template string printf quot;I have %d!nquot;, 10 + 11; printf quot;%s is playing at %snquot;, $act, $hotel; • Format string is like C's printf printf quot;I won $%.2f!nquot;, $winnings; printf quot;%20s %40snquot;, $name, $act; • Can print to a string too $str = sprintf quot;I won $%.2f!nquot;, $winnings; • See the sprintf documentation Copyright © 2000, O’Reilly Associates
  • 65. STDIN • Get the next line of input with STDIN print quot;Enter your name quot;; $name = STDIN; • Line comes with the trailing newline, but you can get rid of it with chomp() chomp( $name = STDIN ); • STDIN returns undef at the end of input Copyright © 2000, O’Reilly Associates
  • 66. Looping with input • Use a loop to read input while( STDIN ) # uses $_ by default { print quot;You entered: $_quot;; } while( defined($_ = STDIN) ) # same thing while( defined($line = STDIN) ) { chomp $line; # get rid of the newline print quot;You entered: $linenquot;; } Copyright © 2000, O’Reilly Associates
  • 67. STDIN as a list • In list context, STDIN returns all the lines of input at once @lines = STDIN; • chomp() works on an array too chomp(@lines); #remove newline from each line Copyright © 2000, O’Reilly Associates
  • 68. Input from files, • Perl can read from files specified on the command line with the “diamond operator” % perl script.pl file1 file2 file3 • Inside the script, it's the same as reading from STDIN while( ) { print quot;Saw line: $_quot;; } Copyright © 2000, O’Reilly Associates
  • 69. Death • Before we go on, we need to talk about die-ing • die() causes your program to stop and send an error message die quot;Oops!quot; unless $status; • If the error message doesn't end in a newline, die() appends the line number Oops! at script_name.pl line 1. • Special variable $! holds the last error message Copyright © 2000, O’Reilly Associates
  • 70. Reading Files • open associates a FILEHANDLE with a file open FILE, quot;filenamequot;; # open for reading • Read just like with STDIN while( FILE ) { print quot;filename: $_quot;; } • Check success of open open FILE, quot;filenamequot; or die quot;Could not open filename!n$!quot;; open (FILE, quot;filenamequot;) || die quot;Could not open filename!n$!quot;; Copyright © 2000, O’Reilly Associates 0
  • 71. Writing files • Open a new file, or truncate an existing one open FILE, quot; filenamequot;; # open for writing • Append data to an existing file open FILE, quot; filenamequot;; # append data • Use print() as before print FILE quot;Blackjack!nquot;; printf FILE quot;%20 stand at %dquot;, $name, $time; • Close files (or rely on autoclose) close(FILE); Copyright © 2000, O’Reilly Associates
  • 72. Opening pipes to processes • Use | at the beginning (think Unix pipelines) open MAIL, quot;| /usr/lib/sendmail -tquot; • Use print as before print MAIL quot;To: plawford@example.comnquot;; Copyright © 2000, O’Reilly Associates
  • 73. Pipes from processes • Use a | at the end open NETSTAT quot;netstat |quot;; • Read data as before while( NETSTAT ) { # do stuff ... } Copyright © 2000, O’Reilly Associates
  • 74. Backticks • Execute an external program and save the output $lines = `ls`; # UNIX $lines = `dir`; # DOS • Works a bit differently in list context – each line shows up as a list element @lines = `dir`; Copyright © 2000, O’Reilly Associates
  • 75. system() • system runs an external program, but shares script's input and output system 'date'; system 'rm -rf *'; # careful! • Can interpolate strings – but be careful system quot;rm -$options $locationquot;; # even worse • What if $location is '*; mail jbishop@example.com /etc/passwd' • List form does not interpret meta-characters system 'rm', $options, $location; Copyright © 2000, O’Reilly Associates
  • 76. Getting help Copyright © 2000, O’Reilly Associates
  • 77. Perl self-help • Now that you know a little Perl, it is time to learn how to learn more :) • Perl comes with hundreds of pages of documentation. • Perl also comes with a tool to look at the docs if they are not installed as manual pages perldoc perl • On Windows platforms, the docs come in HTMLHelp format Copyright © 2000, O’Reilly Associates
  • 78. The manual pages • Perl comes with its documentation • The perl man page is the table of contents % man perl perl Perl overview (this section) perlfaq Perl frequently asked questions perldata Perl data structures perlsyn Perl syntax perlop Perl operators and precedence perlre Perl regular expressions perlrun Perl execution and options perlfunc Perl builtin functions perlvar Perl predefined variables perlsub Perl subroutines perlmod Perl modules: how they work ... Copyright © 2000, O’Reilly Associates
  • 79. Online help •You can also get to the manual pages online http://www.perl.com • Modules and documentation available from the Comprehensive Perl Archive Network (CPAN) http://www.cpan.org http://search.cpan.org • Some questions answered at Perlfaq Prime http://www.perlfaq.com Copyright © 2000, O’Reilly Associates
  • 80. The perlfunc page • All of the Perl builtin functions are in perlfunc • If you are new to Perl, you should skim over this page • You do not have to remember everything, but at least you will know what is available • You can see the information for one function using perldoc perldoc -f sprintf perldoc -f open Copyright © 2000, O’Reilly Associates 0
  • 81. The perlfaq* pages • The common questions about Perl are already answered perlfaq : Table of Contents perlfaq1: General Questions About Perl perlfaq2: Obtaining and Learning about Perl perlfaq3: Programming Tools perlfaq4: Data Manipulation perlfaq5: Files and Formats perlfaq6: Regexps perlfaq7: General Perl Language Issues perlfaq8: System Interaction perlfaq9: Networking • Get to them just like any other manual pages man perlfaq perldoc perlfaq Copyright © 2000, O’Reilly Associates
  • 82. The Camel book • Programming Perl is the de facto reference book for Perl • Larry Wall wrote it, after all, along with Tom Christiansen, Perl’s main documenter • The third edition, which covers Perl 5.6, was just released this summer Copyright © 2000, O’Reilly Associates
  • 83. The Ram book • The first Camel book had a section with examples and common tasks. • This disappeared in the second edition ... • ... but reappeared as the Ram book (The Perl Cookbook) • There are hundreds of recipes along with explanations for most common tasks Copyright © 2000, O’Reilly Associates
  • 84. Warnings • Perl can give you warnings about questionable constructs or problems • You can check your script without running it perl -cw script.pl • You can turn on warnings inside a script #!/usr/bin/perl -w • You can get verbose error messages #!/usr/bin/perl use diagnostics; • Perl 5.6 has a warnings pragma #!/usr/bin/perl use warnings; Copyright © 2000, O’Reilly Associates
  • 85. Dealing with errors • If you make a syntax mistake in a program, there will probably be a cascade of syntax errors • Perl will give you the line number of the line near the problem • Always deal with the first error to appear. A lot of the subsequent errors should disappear. Copyright © 2000, O’Reilly Associates
  • 86. use strict • The strict pragma forces you to be a careful with variable and subroutine names • You must declare all variables or make them lexical #!/usr/bin/perl -w use strict; use vars qw( $singer); $singer = 'Frank'; # okay - pre-declared my $way = 'song'; # okay - lexical $venue = 'Sands'; # WRONG Copyright © 2000, O’Reilly Associates
  • 87. use strict, cont. • Perl has “poetry mode”. Barewords are considered to be subroutine names #!/usr/bin/perl -w use strict; my $casino = Sands; # Sands considered a sub • The strict pragma turns this off #!/usr/bin/perl -w use strict; my $casino = Sands; # okay my $casino = Sands(); # okay my $casino = Sands; # WRONG! Copyright © 2000, O’Reilly Associates
  • 88. use strict, cont. • Declare subroutines before you use them sub Sands { ... } my $casino = Sands; • Pre-declare subroutines use subs qw( Sands ); my $casino = Sands; sub Sands { ... } Copyright © 2000, O’Reilly Associates
  • 89. Starting off right • Anything but a quick ‘n’ dirty script should use warnings and strict #!/usr/bin/perl -w use strict; use subs qw(); use vars qw(); ... • It is a bit of a pain at first, but you will be a better programmer in the long term. :) Copyright © 2000, O’Reilly Associates
  • 90. Regular Expressions Copyright © 2000, O’Reilly Associates 0
  • 91. Regex basics • Regular expressions are simply patterns that describe part of a string • A string either matches or it does not • Regex can match anywhere in a string Copyright © 2000, O’Reilly Associates
  • 92. Simple regexes • The simplest regex is a single character a A • A sequence of characters abc xyz • A period ( . ) will match any character except a newline a.b x.y Copyright © 2000, O’Reilly Associates
  • 93. Character classes • A character class defines a set of characters that can match a[bcd]e # matches abd or ace or ade a[b-y]z # a range of characters a[t ]b # a tab or a space a[0-9] # a digit • Some character classes have shortcuts d # same as [0-9] w # [a-zA-Z0-9_] s # [tfnr ] • Also D, W, S Copyright © 2000, O’Reilly Associates
  • 94. Anchors • Use the caret (^) to match at the beginning of the string ^abc # matches 'abc' but not 'xyzabc' • Use the dollar ($) to match at the end of the string xyz$ # matches 'xyz' but not 'xyzabc' • Use the sequence b to match a “word boundary” Lasb # matches 'Las Vegas' but not 'Laser' Copyright © 2000, O’Reilly Associates
  • 95. Repetition • Match the repetition of a pattern a? # zero or one times a* # zero or more times a+ # one or more times a{2,3} # 2 or 3 times a{$min,} # at least $min times a{,$max} # at most $max times ,{5}chameleon [a-zA-Z]w{0,254} # a Perl variable name • Matches are greedy by default – match as much as possible Copyright © 2000, O’Reilly Associates
  • 96. Alternation • Choose one of several sequences Dean|Dino Frankie|Frank|Ol' Blue Eyes • Alternation has a low precendence – use parenthesis to group sequences ^a|b|c (^a)|b|c # same thing a|b|c$ a|b|(c$) # same thing ^(a|b|c) (a|b|c)$ Copyright © 2000, O’Reilly Associates
  • 97. The match operator • Applies regex to a string – $_ by default /REGEX/ m/REGEX/ #same thing • Returns true if match succeeds if( /REGEX/ ) { print quot;It matches!nquot;; } • The binding operator ( =~ ) applies the match to another string $string =~ m/REGEX/; Copyright © 2000, O’Reilly Associates
  • 98. More matching • The match can be case insensitive { print quot;Do you like Frank Sinatra? quot;; $answer = STDIN; redo unless $answer =~ m/^y/i; } • The match operator does double-quotish interpolation (Regex metacharacters are still special) $regex = 'Dino|Dean'; exit() if( /$regex/ ); # like m/Dino|Dean/ Copyright © 2000, O’Reilly Associates
  • 99. Match variables • Parenthesis trigger memory which can be accessed later $_ = 'Dean Martin'; m/(Dino|Dean) Martin/; $first_name = $1; • Valid until next successful match m/Sammy/; # fails! print $1; # Still 'Dean'; • Memory variables often used with substitutions (coming up) Copyright © 2000, O’Reilly Associates
  • 100. The substitute operator • Use a regex to specify part of a string to replace s/REGEX/REPLACEMENT/ $_ = 'Frank Sinatra'; s/Frank/Frankie/; s/.*(Sinatra)/Chairman $1/; # use memory $name = 'Dean Martin'; $name =~ s/ean/ino/; • Returns true if replacement is successful if( s/Frank/Ol' Blue Eyes/ ) { print quot;Do it my way!nquot;; } Copyright © 2000, O’Reilly Associates 00
  • 101. Affecting s/// behaviour • Make all possible substitutions with g flag s/Dean Martin/Sammy Davis, Jr./g; • Make regex part case insensitive with i flag s/dean martin/Sammy Davis, Jr./i; • Let . match newlines with s flag s//*.**///s; # C comments (almost) Copyright © 2000, O’Reilly Associates 0
  • 102. Alternate delimiters • “Leaning toothpick syndrome” alleviated by alternate delimiters m//usr/bin/perl/ m#/usr/bin/perl# s#/usr/bin/perl#/bin/perl# • Can use paired delimiters m(/usr/bin/perl) m/usr/bin/perl m{/usr/bin/perl} m[/usr/bin/perl] s(/usr/bin/perl){/bin/perl} Copyright © 2000, O’Reilly Associates 0
  • 103. Functions Copyright © 2000, O’Reilly Associates 0
  • 104. Subroutines • Allows code to be reused • Named just like variables, and uses the special symbol • Defined anywhere in the program • Value is last evaluated expression $card = hit_me; sub hit_me { int( rand(11) ); } Copyright © 2000, O’Reilly Associates 0
  • 105. Return values • Return value is last expression evaluated sub take_card { if( $total 17 ) { 'stand' } else { 'Hit' } } • Use return if you like sub take_card { ...; return 'Stand' if $total 17; } Copyright © 2000, O’Reilly Associates 0
  • 106. Arguments • We can send data to the subroutine add($x, $y) • Arguments show up in the @_ array sub add { ($m, $n) = @_; $m + $n; } • Each subroutine invocation has it's own @_ Copyright © 2000, O’Reilly Associates 0
  • 107. Local variables • All variables are “global” by default • You can create “local” versions to hide the global versions temporarily sub foo { local($x, $y); ($x,$y) = @_; ... } local ($x, $y) = @_; # assign value directly • Works with all variable types local( @array, %hash ); Copyright © 2000, O’Reilly Associates 0
  • 108. More local variables • Local variables temporarily hide a global value $name = 'Frank'; print quot;Name is $namenquot;; # 'Frank' $first_name = get_name( 'Martin' ); print quot;Name is $namenquot;; # 'Frank' sub get_name { local ($name) = @_; print quot;Name is $namenquot;; # 'Martin' $first_names{$name}; } Copyright © 2000, O’Reilly Associates 0
  • 109. Lexical variables • local works as long as the block has not exited • Lexical (“my”) variables only work inside the block • Lexical variables are faster • Special variables cannot be lexical (not yet) local $_ = 'Dean Martin' # OKAY my $_ = 'Frank Sinatra' # WRONG!! (warning) Copyright © 2000, O’Reilly Associates 0
  • 110. More lexical variables • Only work inside their scope $name = 'Frank'; tell(); # 'Frank' $first_name = get_name( 'Dean' ); tell(); # 'Frank' sub get_name { my ($name) = @_; print quot;$namenquot;; # 'Dean' tell(); # leaves scope - 'Frank' $first_names{$name}; } sub tell { print quot;$namenquot; }; Copyright © 2000, O’Reilly Associates 0
  • 111. Global or lexical? • Lexically-scoped variables are preferred • The limited scope means that they only affect their part of the world. • You don’t have to remember all of the variables used in the entire program • Programs are easier to debug • However, lexical variables take up a bit more memory Copyright © 2000, O’Reilly Associates
  • 112. Text Manipulation Copyright © 2000, O’Reilly Associates
  • 113. Finding substrings • index finds a substring $pos = index $string, $substring; • Position is zero base and returns -1 if not found $pos = index quot;Stardustquot;, quot;Starquot;; # $pos is 0 $pos = index quot;Stardustquot;, quot;dustquot;; # $pos is 4 $pos = index quot;Stardustquot;, quot;xorquot;; # $pos is -1 • Can start looking at a certain position $pos = index quot;Stardustquot;, quot;tquot;, 2; #starts at 2 $pos = index quot;Stardustquot;, quot;tquot;, $pos + 1; • rindex searches from righthand side $pos = rindex quot;Stardustquot;, quot;tquot;; # $pos is 7 Copyright © 2000, O’Reilly Associates
  • 114. Extracting substrings • substr extracts a substring based on position $sub_str = substr $string, $start, $length $str = substr quot;Frank Sinatraquot;, 6, 7; # Sinatra $str = substr quot;Joey Bishopquot;, 5 # Bishop • Useful with index $name = 'Dean Martin'; $str = substr $name, index($name, 'M'); • Can replace strings substr($name,0,4) = 'Dino'; # Dino Martin substr($name,0,4) =~ s/ean/ino/; # same thing Copyright © 2000, O’Reilly Associates
  • 115. Transliteration • tr replaces characters with other characters. Uses $_ by default. tr/a/b/; tr/ei/ie/; tr/a-z/n-za-m/; $other_var =~ tr/a-z/n-za-m/; • Returns the number of characters affected $count = tr/0-9/0-9/; $count = tr/0-9//; #same thing • Many more things you can do with tr – see the documentation Copyright © 2000, O’Reilly Associates
  • 116. split • Break a string up according to a regex @bits = split /REGEX/, $string; • The regex specifies the field delimiter @names = split /:/, 'Joey:Sammy:Peter'; • Trailing empty fields are ignored. Leading empty fields are retained (as undef) @names = split /:/, ':::Joey:Sammy:Peter:::'; • Defaults to splitting $_ on whitespace @name = split; Copyright © 2000, O’Reilly Associates
  • 117. join • Like the reverse of split, but does not use a regex $str = join $separator, @bits; @names = split /:/, quot;Frank:Dean:Joeyquot;; $str = join ':', @names; # where we started $str = join ', ', @name; # different delimiter • Can get the glue string at the end print join quot;nquot;, @names, ''; Copyright © 2000, O’Reilly Associates
  • 118. Case shifting • uc makes everything uppercase, lc, lowercase uc(quot;Blackjack!quot;); #'BLACKJACK!' lc(quot;BLACKJACK!quot;); # 'blackjack!' • ucfirst and lcfirst affect only the first character $name = ucfirst(quot;frankiequot;); # 'Frankie' $name = lcfirst(quot;Brianquot;); # 'brian' • Can also be done inside the strings quot;LBLACKJACK!quot; # 'blackjack!quot; quot;Ublackjack!quot; # 'BLACKJACK!quot; quot;blackujack!quot; # 'blackJack!quot; quot;LBLACKEJACK!quot; # 'blackJACK!' Copyright © 2000, O’Reilly Associates
  • 119. Sorting Copyright © 2000, O’Reilly Associates
  • 120. Simple sorts • sort returns a sorted list, leaving the original intact @sorted = sort @array; • Sorting is done “ASCIIbetically” • Sorting is done in increasing order • Numbers are compared as strings 1, 11, 12, 2, 20 Copyright © 2000, O’Reilly Associates 0
  • 121. Advanced sorting • You might not want to sort “ASCIIbetically”, but you can create your own sorting routine sub by_numbers { if($a $b){1} elsif($a $b){-1} else {0} } @sorted = sort by_numbers @values • This is so common it has a shorthand (the “spaceship” operator) @sorted = sort { $a = $b } @values; @sorted = sort { $a cmp $b } @values; # ASCII Copyright © 2000, O’Reilly Associates
  • 122. More sorting • The sorting routine can be arbitrarily complex %winnings = ( Tropicana = 5_400, Stardust = 3_290, Luxor = 6_400, Sands = 5, ); @keys = sort {$winnings{$a} = $winnings{$b}} keys %winnings; • Add a secondary sort @keys = sort { $winnings{$a} = $winnings{$b} or $a cmp $b } keys %winnings; Copyright © 2000, O’Reilly Associates
  • 123. Even more sorting • So far the sort order has been ascending • reverse returns the list the other way around @descending = reverse sort @list; • But you can also sort anyway that you like @descending = sort { $b cmp $a } @list; @descending = sort { $b = $a } @list; Copyright © 2000, O’Reilly Associates
  • 124. An example • Let’s sort by a unique key of a flat file database #!/usr/bin/perl # key:field1:field2:field3 open FILE, $filename or die quot;$!quot;; foreach( FILE ) { chomp; my $key = ( split /:/ )[0]; $line{$key} = $_; } open OUT, quot; $filename.sortedquot; or die quot;$!quot;; foreach(sort keys %line) { print quot;$line{$_}nquot; } Copyright © 2000, O’Reilly Associates
  • 125. A sort subroutine example •Let’s sort by IP numbers (this is not the best way to do it, by the way) sub by_bytes { # 192.168.1.1 my ($ip_a, $ip_b) = ($a, $b); my @a = split /./, $a; my @b = split /./, $b; COMPARE: { if( $a[0] $b[0] ) { return 1 } elsif( $a[0] $b[0] ) { return -1 } else { shift @a; shift @b; last COMPARE unless @a; redo COMPARE; } } return 0; } Copyright © 2000, O’Reilly Associates
  • 126. Sorting IPs, con't #!/usr/bin/perl chomp(@ips = DATA); # Take data after __END__ print quot;IPs are @ipsnquot;; foreach( sort by_bytes @ips) { print quot;$_nquot;; } __END__ 199.60.48.64 166.84.185.32 209.85.3.25 208.201.239.50 Copyright © 2000, O’Reilly Associates
  • 127. Using modules Copyright © 2000, O’Reilly Associates
  • 128. use and require • Perl comes with many libraries and modules • require pulls in external code just as if you had typed it into your program require quot;chat2.plquot;; •use does the same thing, with an extra import step use CGI; #anything CGI exports use quot;CGI.pmquot;; #same thing use CGI qw(:html); #only the :html stuff Copyright © 2000, O’Reilly Associates
  • 129. Using modules • How modules work is beyond the scope of this course, but we can still use them. • Modules are found at CPAN http://search.cpan.org • Let’s use them to get some work done, though #import a function from lib-WWW-Perl (LWP) use LWP::Simple qw(get); #fetch a web page my $data = get(quot;http://www.perl.orgquot;); Copyright © 2000, O’Reilly Associates
  • 130. How to use a module • Modules come with documentation • Use perldoc perldoc Net::FTP • On Win32, docs are in HTMLHelp • MacPerl uses a program called “Shuck” • Let's look at Net::FTP as an example. It's not part of the standard distribution. Get it at http://search.cpan.org/search?module=Net::FTP Copyright © 2000, O’Reilly Associates 0
  • 131. How to use a module, cont. NAME Net::FTP - FTP Client class SYNOPSIS use Net::FTP; $ftp = Net::FTP-new(quot;some.host.namequot;); $ftp-login(quot;anonymousquot;,quot;me@here.comquot;); $ftp-cwd(quot;/pubquot;); $ftp-get(quot;that.filequot;); $ftp-quit; DESCRIPTION Net::FTP is a class implementing a simple FTP client in Perl yadda yadda yadda... Copyright © 2000, O’Reilly Associates
  • 132. An example: Net::FTP • Suppose we want to download our current work schedule • Just follow the example! use Net::FTP; my $ftp = new Net::FTP 'ftp.example.com'; $ftp-login(quot;anonymousquot;, quot;plawford@example.comquot;); $ftp-cwd(quot;/pub/Sandsquot;); $ftp-get(quot;schedule.docquot;); $ftp-quit; • The file is saved in the current directory Copyright © 2000, O’Reilly Associates
  • 133. Files Copyright © 2000, O’Reilly Associates
  • 134. The stat function • stat returns a list of file properties ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename); • Use a literal slice to get only parts of it ($mode,$uid,$gid) = ( stat($filename) )[2,4,5] • Win32 users see Win32::File (not standard) use Win32::File; Win32::File::GetAttributes(quot;tour.docquot;, $att) Copyright © 2000, O’Reilly Associates
  • 135. Modify file properties • Change file permissions (different for Win32) chmod 0666, @file_list; # notice octal number! • Can also use File::chmod use File::chmod; chmod(quot;+xquot;, @files); • Win32 users can use Win32::File use Win32::File; Win32::File::SetAttributes(quot;set.docquot;, $att); • Change timestamp information utime $access_time, $mod_time, @file_list; Copyright © 2000, O’Reilly Associates
  • 136. Rename, copy, or delete • Rename a file rename $old_name, $new_name; • Must use file name (not like Unix's mv) rename quot;winnings.xlsquot;, quot;dirquot;; #WRONG!! rename quot;winnings.xlsquot;, quot;dir/winnings.xlsquot;; • Copy a file using File::Copy use File::Copy; copy($original, $copy); • Remove a file $count = unlink @files; Copyright © 2000, O’Reilly Associates
  • 137. File::Basename • Comes with three functions for manipulating file paths – we’ll look at two of them • Works with Unix, VMS, Win, and Mac without you having to do anything use File::Basename; $dir = dirname('C:SystemFooRotBaz'); # $dir is 'C:SystemFooRot'; $file = basename('/usr/local/lib/perl'); # $file is 'perl' Copyright © 2000, O’Reilly Associates
  • 138. File test operators • Return true or false for a test against a FILEHANDLE or filename print quot;Found a directory!nquot; if -d $filename; • Defaults to the filename in $_ • Readable, writable, executable: -r, -w, -x • Exists: -e • Plain file, directory, link: -f, -d, -l • File size: -s returns the file size, in bytes $size = -s $filename • is a tty (terminal): -t print quot;We're interactive!nquot; if -t STDIN; Copyright © 2000, O’Reilly Associates
  • 139. An example • Get the five most recently modified files #!/usr/bin/perl foreach( * ) { next unless -f; $hash{$_} = (stat _)[9]; # my $mtime = -M; } foreach( sort {$hash{$b} = $hash{$a}} keys %hash ) { last if $count++ 5; $time = localtime($hash{$_}); printf quot;%-25s %snquot;, $_, $time; } Copyright © 2000, O’Reilly Associates
  • 140. Directories Copyright © 2000, O’Reilly Associates 0
  • 141. mkdir rmdir • Create a directory mkdir $dir_name, 0755 #notice octal number mkdir $dir_name, 0777 #for Win32 users • Remove a directory (must be empty!) rmdir $dir_name; • There isn't a Perl-ish way to recursively remove directories, so you might have to resort to system system 'rm', '-r', $dir_name; Copyright © 2000, O’Reilly Associates
  • 142. The current directory • The current working directory decides how to resolve relative file paths • Cwd work across platforms use Cwd; $dir = cwd(); • Change to another directory chdir($dir_name) or die quot;$!quot;; Copyright © 2000, O’Reilly Associates
  • 143. Globbing • Can use the glob operator – * • Looks like the “diamond” operator, but isn't @files = *.plx; # files ending in .plx @files = *.doc *.xls • There is also a built-in function @files = glob(quot;*.plxquot;); Copyright © 2000, O’Reilly Associates
  • 144. Directory access • Directory handles are similar to file handles opendir(DIR, $dir) or die quot;$!quot;; • Get a list of files from that directory @files = readdir(DIR); • Includes . and .. , so you might see @files = grep ! /^..?$/, readdir(DIR); • Close the directory handle closedir(DIR); Copyright © 2000, O’Reilly Associates
  • 145. An example • Print a sorted list of filenames with file size #!/usr/bin/perl use Cwd; opendir DIR, getcwd() or die quot;Could not open directory!n$!quot;; foreach( sort readdir DIR ) { next if /^./; next unless -f; printf quot;%8d %snquot;, -s, $_; } closedir DIR; Copyright © 2000, O’Reilly Associates
  • 146. Another example • Let’s sort by file size though #!/usr/bin/perl use Cwd; opendir DIR, getcwd() or die quot;Could not open directory!n$!quot;; foreach( readdir DIR ) { next if /^./ or not -f; $files{$_} = -s; } foreach( sort { $files{$a} = $files{$b} } keys %files ) { printf quot;%8d %snquot;, $files{$_}, $_; } Copyright © 2000, O’Reilly Associates
  • 147. One - liners Copyright © 2000, O’Reilly Associates
  • 148. Command line scripts • Scripts can be executed on the command line perl -e 'print quot;Hello there!nquot;' perl -ne 'print if /Perl/' * perl -pe 's/sh/perl/g' * • Complete documentation in perlrun Copyright © 2000, O’Reilly Associates
  • 149. Adding a while() loop • -n adds a while loop around your -e script perl -n -e 'print quot;I saw: $_quot;' file.txt same as #!/usr/bin/perl while() { print quot;I saw: $_quot; } Copyright © 2000, O’Reilly Associates
  • 150. Even better! • -p is like -n, but with a print at the bottom of the loop perl -p -e 's/peterbilt/;/g' file.txt same as #!/usr/bin/perl while() { s/peterbilt/;/g; print } Copyright © 2000, O’Reilly Associates 0
  • 151. Editing files in place • The -i switch turns on inplace editing • Original files are moved, and munged data shows up in new files of the same name perl -pi.old -e 's/cM//' *.txt same as #!/usr/bin/perl $^I = quot;.oldquot;; while() { s/cM//g; print } Copyright © 2000, O’Reilly Associates
  • 152. Splitting data • The -a switch splits the input line into @F • Splits on whitespace by default (use -F to specify alternate delimiter) perl -ane 'print quot;$F[2]nquot;' file.txt same as #!/usr/bin/perl while( ) { @F = split /s+/, $_; print quot;$F[2]nquot; } Copyright © 2000, O’Reilly Associates
  • 153. Conclusion Copyright © 2000, O’Reilly Associates
  • 154. What we did not cover • References • Complex data structures $matrix[$x][$y] $hash{$city}{$title}{$name} • Networking and client/server programming • Object-oriented programming • Much, much more ... Copyright © 2000, O’Reilly Associates
  • 155. What to do next • Start writing some Perl scripts remember that “baby talk” is okay • Read everything about Perl you can, even if you do not always understand it • Slowly add to your Perl skills • Look at modules and scripts for examples Copyright © 2000, O’Reilly Associates
  • 156. Getting Perl support • Corporate support packages are available for Perl • PerlDirect http://www.perldirect.com • The Perl Clinc http://www.perlclinic.com • Free information at www.perl.org and www. perl.com Copyright © 2000, O’Reilly Associates
  • 157. References Copyright © 2000, O’Reilly Associates
  • 158. Books Learning Perl, Randal L. Schwartz and Tom Christiansen Learning Perl on Win32, Randal L. Schwartz, Tom Christiansen, and Eric Olsen Programming Perl, Larry Wall, Tom Christiansen, and Jon Orwant Effective Perl Programming, Joseph Hall and Randal L. Schwartz Copyright © 2000, O’Reilly Associates
  • 159. Online Resources The Perl Language Pages http://www.perl.com Perl Mongers http://www.perlmongers.org Perl user groups http://www.pm.org Comprehensive Perl Archive Network http://www.cpan.org Copyright © 2000, O’Reilly Associates