Here is one way to sort the arrays by age and then by income:
@sorted = sort { $age[$a] <=> $age[$b] || $income[$a] <=> $income[$b] } @index;
This uses the spaceship operator (<=>) to first compare the ages, and if they are equal, then compares the incomes to break the tie.
2. 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
November 22, 2012
3. 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
November 22, 2012
4. 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
November 22, 2012
5. Web Sources for Perl
Web
www.perl.com
www.perldoc.com
www.perl.org
www.perlmonks.org
November 22, 2012
6. 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
November 22, 2012
7. “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
November 22, 2012
9. 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
November 22, 2012
10. 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
November 22, 2012
11. 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
November 22, 2012
12. 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;
November 22, 2012
13. 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
November 22, 2012
14. 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
November 22, 2012
15. 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);
November 22, 2012
16. 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
November 22, 2012
17. 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'
November 22, 2012
18. 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
November 22, 2012
19. Character Interpolation
List of character escapes that are recognized
when using double quoted strings
n newline
t tab
r carriage return
Common Example :
print “Hellon”; # prints Hello and then a return
November 22, 2012
20. 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!
November 22, 2012
23. 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!
November 22, 2012
24. While Loop
Example :
$i = 0;
while ( $i <= 1000 )
{
print “$in”;
$i++;
}
November 22, 2012
25. Until Loop
The until function evaluates an expression
repeatedly until a specific condition is met.
Example:
$i = 0;
until ($i == 1000) {
print “$in”;
$i++;
}
November 22, 2012
26. For Loops
Syntax 1:
for ( $i = 0; $i <= 1000; $i=$i+2 )
{
print “$in”;
}
Syntax 2:
for $i(0..1000)
{
print “$in”;
}
November 22, 2012
27. 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 “$in”;}
}
November 22, 2012
29. Exercise
Use a loop structure and code a program that
produces the following output:
A
AA
AAA
AAAB
AAABA
AAABAA
AAABAAA
AAABAAAB
…..
November 22, 2012
TIP: $chain = $chain . “A”;
30. Exercise
#! /usr/bin/perl
for ($i=0, $j=0; $i<100; $i++)
{
if ( $j==3){$chain.=“B”;$j=0;}
else {$chain.=“A”; $j++;}
print “$chainn”;
}
November 22, 2012
31. 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 :
November 22, 2012 rand 100
34. 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
November 22, 2012
35. 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] ?
November 22, 2012
Answer1 : Value is set to 0 in Perl
Answer2: Anything in C!!!!!
36. 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
November 22, 2012
37. 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
November 22, 2012
38. Numerical Sorting Example
#!/usr/local/bin/perl -w
@unsortedArray = (3, 10, 76, 23, 1, 54);
@sortedArray = sort numeric @unsortedArray;
print “@unsortedArrayn”; # prints 3 10 76 23 1 54
print “@sortedArrayn”; # 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
November 22, 2012
39. String Sorting Example
#!/usr/local/bin/perl -w
@unsortedArray = (“Larry”, “Curly”, “moe”);
@sortedArray = sort { lc($a) cmp lc($b)} @unsortedArray;
print “@unsortedArrayn”; # prints Larry Curly moe
print “@sortedArrayn”; # prints Curly Larry moe
November 22, 2012
40. Foreach
Foreach allows you to iterate over an array
Example:
foreach $element (@array)
{
print “$elementn”;
}
This is similar to :
for ($i = 0; $i <= $#array; $i++)
{
print “$array[$i]n”;
}
November 22, 2012
41. 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
November 22, 2012
42. 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:
November 22, 2012
-Sort the index, using information contained in the other arrays.
43. 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]; }
}
November 22, 2012
45. 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
November 22, 2012
46. 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
November 22, 2012
47. 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”
November 22, 2012
48. 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”
November 22, 2012
49. 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”)
November 22, 2012
50. 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 :
November 22, 2012
“Larry”, “Curly”, “Moe”
51. Exercise: Spliting
Instructions
Remove
shift: beginning, pop: end
Add
Unshift: beginning, push: end
Use split, shift and push to turn the following string:
“The enquiry 1 was administered to five couples”
“The enquiry 2 was administered to six couples”
“The enquiry 3 was administered to eigh couples”
Into
“five couples were administered the enquiry 1”
….
November 22, 2012
52. Exercise: Spliting
Use split, shift and push to turn the following string:
$s[0]= “The enquiry 1 was administered to five couples”;
$s[1]= “The enquiry 2 was administered to six couples”;
$s[2]= “The enquiry 3 was administered to eigh couples”;
foreach $s(@s)
{
@s2=split (/was administered to/, $s);
$new_s=“$s2[1] were admimistered $s2[0]”;
print “$new_sn”;
}
November 22, 2012
54. Multi Dimensional Arrays
Better use Hash tables (cf later)
If you need to:
@tab=([‘Monday’,’Tuesday’],
[‘Morning’,’Afternoon’,’Evening’]);
$a=$tab[0][0] # $a == ‘Monday’
$tab2=(‘midnight’, ‘Twelve’);
$tab[2]=@tab2 # integrate tab2 as the last row
of tab
November 22, 2012