550 likes | 643 Views
Introduction to Perl Part I. By: Cédric Notredame (Adapted from BT McInnes). What is Perl?. Perl is a Portable Scripting Language No compiling is needed. Runs on Windows, UNIX, LINUX and cygwin Fast and easy text processing capability Fast and easy file handling capability
E N D
Introduction to PerlPart I By: Cédric Notredame (Adapted from BT McInnes)
What is Perl? • Perl is a Portable Scripting Language • No compiling is needed. • Runs on Windows, UNIX, LINUX and cygwin • Fast and easy text processing capability • Fast and easy file handling capability • Written by Larry Wall • “Perl is the language for getting your job done.” • Too Slow For Number Crunching • Ideal for Prototyping
How to Access Perl • To install at home • Perl Comes by Default on Linux, Cygwin, MacOSX • www.perl.com Has rpm's for Linux • www.activestate.com Has binaries for Windows • Latest Version is 5.8 • To check if Perl is working and the version number • % perl -v
Resources For Perl • Books: • Learning Perl • By Larry Wall • Published by O'Reilly • Programming Perl • By Larry Wall,Tom Christiansen and Jon Orwant • Published by O'Reilly • Web Site • http://safari.oreilly.com • Contains both Learning Perl and Programming Perl in ebook form
Web Sources for Perl • Web • www.perl.com • www.perldoc.com • www.perl.org • www.perlmonks.org
The Basic Hello World Program • which perl • pico hello.pl • Program: #! /…path…/perl -w print “Hello World!\n”; • Save this as “hello.pl” • Give it executable permissions • chmod a+x hello.pl • Run it as follows: • ./hello.pl
“Hello World” Observations • “.pl” extension is optional but is commonly used • The first line “#!/usr/local/bin/perl” tells UNIX where to find Perl • “-w” switches on warning : not required but a really good idea
Numerical Literals • Numerical Literals • 6 Integer • 12.6 Floating Point • 1e10 Scientific Notation • 6.4E-33 Scientific Notation • 4_348_348 Underscores instead of commas for long numbers
String Literals • String Literals • “There is more than one way to do it!” • 'Just don't create a file called -rf.' • “Beauty?\nWhat's that?\n” • “” • “Real programmers can write assembly in any language.” • Quotes from Larry Wall
Types of Variables • Types of variables: • Scalar variables : $a, $b, $c • Array variables : @array • Hash variables : %hash • File handles : STDIN, STDOUT, STDERR • Variables do not need to be declared • Variable type (int, char, ...) is decided at run time • $a = 5; # now an integer • $a = “perl”; # now a string
Operators on Scalar Variables • Numeric and Logic Operators • Typical : +, -, *, /, %, ++, --, +=, -=, *=, /=, ||, &&, ! ect … • Not typical: ** for exponentiation • String Operators • Concatenation: “.” - similar to strcat $first_name = “Larry”; $last_name = “Wall”; $full_name = $first_name . “ “ . $last_name;
Equality Operators for Strings • Equality/ Inequality : eq and ne $language = “Perl”; if ($language == “Perl”) ... # Wrong! if ($language eq “Perl”) ... #Correct • Use eq / ne rather than == / != for strings
Relational Operators for Strings • Greater than • Numeric : > String : gt • Greater than or equal to • Numeric : >= String : ge • Less than • Numeric : < String : lt • Less than or equal to • Numeric : <= String : le
String Functions • Convert to upper case • $name = uc($name); • Convert only the first char to upper case • $name = ucfirst($name); • Convert to lower case • $name = lc($name); • Convert only the first char to lower case • $name = lcfirst($name);
A String Example Program • Convert to upper case • $name = uc($name); • Convert only the first char to upper case • $name = ucfirst($name); • Convert to lower case • $name = lc($name); • Convert only the first char to lower case • $name = lcfirst($name); #!/usr/bin/perl $var1 = “larry”; $var2 = “moe”; $var3 = “shemp”; …… Output: Larry, MOE, sHEMP
A String Example Program #!/usr/local/bin/perl $var1 = “larry”; $var2 = “moe”; $var3 = “shemp”; print ucfirst($var1); # Prints 'Larry' print uc($var2); # Prints 'MOE' print lcfirst(uc($var3)); # Prints 'sHEMP'
Variable Interpolation • Perl looks for variables inside strings and replaces them with their value $stooge = “Larry” print “$stooge is one of the three stooges.\n”; Produces the output: Larry is one of the three stooges. • This does not happen when you use single quotes print '$stooge is one of the three stooges.\n’; Produces the output: $stooge is one of the three stooges.\n
Character Interpolation • List of character escapes that are recognized when using double quoted strings • \n newline • \t tab • \r carriage return • Common Example : • print “Hello\n”; # prints Hello and then a return
Numbers and Strings are Interchangeable • If a scalar variable looks like a number and Perl needs a number, it will use it as a number $a = 4; # a number print $a + 18; # prints 22 $b = “50”; # looks like a string, but ... print $b – 10; # will print 40!
If ... else ... statements if ( $weather eq “Rain” ) { print “Umbrella!\n”; } elsif ( $weather eq “Sun” ) { print “Sunglasses!\n”; } else { print “Anti Radiation Armor!\n”; }
Unless ... else Statements • Unless Statements are the opposite of if ... else statements. unless ($weather eq “Rain”) { print “Dress as you wish!\n”; } else { print “Umbrella!\n”; } • And again remember the braces are required!
While Loop • Example : $i = 0; while ( $i <= 1000 ) { print “$i\n”; $i++; }
Until Loop • The until function evaluates an expression repeatedly until a specific condition is met. • Example: $i = 0; until ($i == 1000) { print “$i\n”; $i++; }
For Loops • Syntax 1: • for ( $i = 0; $i <= 1000; $i=$i+2 ) { print “$i\n”; } • Syntax 2: • for $i(0..1000) { print “$i\n”; }
Moving around in a Loop • next: ignore the current iteration • last: terminates the loop. • What is the output for the following code snippet: for ( $i = 0; $i < 10; $i++) { if ($i == 1 || $i == 3) { next; } elsif($i == 5) { last; } else {print “$i\n”;} }
Answer 0 2 4
Exercise • Use a loop structure and code a program that produces the following output: AAAAAAAAAB AAABA AAABAA AAABAAA AAABAAAB ….. TIP: $chain = $chain . “A”;
Exercise #! /usr/bin/perlfor ($i=0, $j=0; $i<100; $i++) { if ( $j==3){$chain.=“B”;$j=0;} else {$chain.=“A”; $j++;} print “$chain\n”; }
Exercise: Generating a Random Sample • A study yields an outcome between 0 and 100 for every patient. You want to generate an artificial random study for 100 patients: Patient 1 99 Patient 2 65 Patient 3 89 …. Tip: - use the srand to seed the random number generator -use rand 100 to generate values between 0 and 100 : rand 100
Exercise for ($i=0; $i<100; $i++) { $v=rand 100; #print “Patient $i $v\n”; printf “Patient %d %.2f\n\n”, $i, $v;#%s : chaines, strings#%d : integer #%f : floating points }
Arrays • Array variable is denoted by the @ symbol • @array = ( “Larry”, “Curly”, “Moe” ); • To access the whole array, use the whole array • print @array; # prints : Larry Curly Moe • Notice that you do not need to loop through the whole array to print it – Perl does this for you
Arrays cont… • Array Indexes start at 0 !!!!! • To access one element of the array : use $ • Why? Because every element in the array is scalar • print “$array[0]\n”; # prints : Larry • Question: • What happens if we access $array[3] ? • Answer1 : Value is set to 0 in Perl • Answer2: Anything in C!!!!!
Arrays cont ... • To find the index of the last element in the array print $#array; # prints 2 in the previous # example • Note another way to find the number of elements in the array: $array_size = @array; • $array_size now has 3 in the above example because there are 3 elements in the array
Sorting Arrays • Perl has a built in sort function • Two ways to sort: • Default : sorts in a standard string comparisons order • sort LIST • Usersub: create your own subroutine that returns an integer less than, equal to or greater than 0 • Sort USERSUB LIST • The <=> and cmp operators make creating sorting subroutines very easy
Numerical Sorting Example #!/usr/local/bin/perl -w @unsortedArray = (3, 10, 76, 23, 1, 54); @sortedArray = sort numeric @unsortedArray; print “@unsortedArray\n”; # prints 3 10 76 23 1 54 print “@sortedArray\n”; # prints 1 3 10 23 54 76 sub numeric { return $a <=> $b; } # Numbers: $a <=> $b : -1 if $a<$b , 0 if $a== $b, 1 if $a>$b # Strings: $a cpm $b : -1 if $a<$b , 0 if $a== $b, 1 if $a>$b
String Sorting Example #!/usr/local/bin/perl -w @unsortedArray = (“Larry”, “Curly”, “moe”); @sortedArray = sort { lc($a) cmp lc($b)} @unsortedArray; print “@unsortedArray\n”; # prints Larry Curly moe print “@sortedArray\n”; # prints Curly Larry moe
Foreach • Foreach allows you to iterate over an array • Example: foreach $element (@array) { print “$element\n”; } • This is similar to : for ($i = 0; $i <= $#array; $i++) { print “$array[$i]\n”; }
Sorting with Foreach • The sort function sorts the array and returns the list in sorted order. • Example : @array( “Larry”, “Curly”, “Moe”); foreach $element (sort @array) { print “$element ”; } • Prints the elements in sorted order: Curly Larry Moe
Exercise: Sorting According to Multiple Criterion • Use the following initialization to sort individuals by age and then by income: • Syntax @sortedArray = sort numeric @unsortedArray; sub numeric { return $a <=> $b; } Data @index=(0,1,2,3,4);@name=(“V”,“W”,”X”,”Y”,”Z”);@age=(10,20, 15, 20, 10);@income=(100,670, 280,800,400); • Output: Name X Age A Income I… Tip: -Sort the index, using information contained in the other arrays.
Exercise: Sorting According to Multiple Criterion • @index=(0,1,2,3,4,5);@name=(“V”,“W”,”X”,”Y”,”Z”);@age=(10,20, 15, 20, 10);@income=(100,670, 280,800,400);foreach $i ( sort my_numeric @index) { print “$name[$i] $age[$i] $income[$i]; }sub my_numeric { if ($age[$a] == $age[$b]) {return $income[$a]<=>$income[$b]; } else {return $age[$a]<=>$age[$b]; } }
Strings to Arrays : split • Split a string into words and put into an array @array = split( /;/, “Larry;Curly;Moe” ); @array= (“Larry”, “Curly”, “Moe”); # creates the same array as we saw previously • Split into characters @stooge = split( //, “curly” ); # array @stooge has 5 elements: c, u, r, l, y
Split cont.. • Split on any character @array = split( /:/, “10:20:30:40”); # array has 4 elements : 10, 20, 30, 40 • Split on Multiple White Space @array = split(/\s+/, “this is a test”; # array has 4 elements : this, is, a, test • More on ‘\s+’ later
Arrays to Strings • Array to space separated string @array = (“Larry”, “Curly”, “Moe”); $string = join( “;“, @array); # string = “Larry;Curly;Moe” • Array of characters to string @stooge = (“c”, “u”, “r”, “l”, “y”); $string = join( “”, @stooge ); # string = “curly”
Joining Arrays cont… • Join with any character you want @array = ( “10”, “20”, “30”, “40” ); $string = join( “:”, @array); # string = “10:20:30:40” • Join with multiple characters @array = “10”, “20”, “30”, “40”); $string = join(“->”, @array); # string = “10->20->30->40”
Arrays as Stacks and Lists • To append to the end of an array : @array = ( “Larry”, “Curly”, “Moe” ); push (@array, “Shemp” ); print $array[3]; # prints “Shemp” • To remove the last element of the array (LIFO) $elment = pop @array; print $element; # prints “Shemp” • @array now has the original elements (“Larry”, “Curly”, “Moe”)
Arrays as Stacks and Lists • To prepend to the beginning of an array @array = ( “Larry”, “Curly”, “Moe” ); unshift @array, “Shemp”; print $array[3]; # prints “Moe” print “$array[0]; # prints “Shemp” • To remove the first element of the array $element = shift @array; print $element; # prints “Shemp” • The array now contains only : • “Larry”, “Curly”, “Moe”