Programming Perls* Objective: To introduce students to the perl language. Perl is a language for getting your job done. Making Easy Things Easy & Hard Things Possible Perl is a language for easily manipulating text, files, and processes Combines concepts from unix, sed, awk, shell scripts Language of system administrators, web developers and more… Practical Extraction and Report Language Pathologically Eclectic Rubbish Lister *Many of the examples in this lecture come from “Learning Perl”, 3rd Ed, R. Schwartz & T. Phoenix, O’Reilly, 2001
Topics Getting Started scalars lists and arrays hashes I/O File handles regular expressions
Hello, World! #!/usr/bin/perl print "Hello, World!\n"; @lines = `perldoc -u -f atan2`; foreach (@lines) { s/(\w)<([^>]+)>/$1<\U$2>/g; print; }
A More Complicated Example #!/usr/bin/perl -w open(FIND,"find . -print |") || die "Couldn't run find: $!\n"; FILE: while ($filename = <FIND>) { chomp($filename); next FILE unless -T $filename; if (!open(TEXTFILE, $filename)) { print STDERR "Can't open $filename--continuing...\n"; next FILE; } while (<TEXTFILE>) { foreach $word (@ARGV) { if (index($_,$word) >= 0) { print "$filename: $word\n"; next;
Getting Help man perl perldoc Learning Perl Programming Perl www.cpan.org, www.pm.org, www.perlmonks.org
scalars numbers: 3, 3.14159, 7.24e15 strings: ‘fred’, “barney”, “hello\n” variables: $name, $count assignment: $name = ‘fred’; $count = 1; $count += 1; $name = $fred . ‘flinstone’; special variables: $_
operators numbers strings 2+3, 5.1-2.4, 3 * 12, 14/2, 10/3 ==, !=, <, >, <=, >= strings concatenation: str1 . str2 replication: str x num eq, ne, lt, gt, le, ge
print single vs. double quotes print “My name is $name\n” ‘$firstname flinstone’ “$firstname flinstone” print “My name is $name\n” print $firstname, $lastname, “\n” STDOUT, STDERR
Conditionals Boolean value (any scalar value) $count = 10; false: undef, 0, ‘’, ‘0’ true: everything else $count = 10; if ($count > 0) { print $count, “\n”; $count -= 1; } else { print “blast off\n”; }
Loops $count =10; while ($count > 0) { print $count, “\n”; } print “blast off\n”;
Getting User Input line input operator: <STDIN> $line = <STDIN> # includes \n chomp removes \n chomp($line)
Sum Odd Numbers #!/usr/bin/perl #Add up some odd numbers $n = 1; print "How many odd numbers do you want to add? "; $howmany = <STDIN>; chomp($howmany); while ($n <= $howmany) { $sum += 2*$n - 1; $n += 1; } print "The sum of the first $howmany odd numbers = $sum\n";
Exercise 2.1 Write a program that computes the circumference of a circle with radius 12.5. Use $pi = 3.141592654
Exercise 2.2 Modify the previous program to prompt and read the radius
Exercise 2.3 Modify the previous program so that if the radius is less than zero, the circumference is set to zero.
Exercise 2.4 Write a program that prompts for and reads two numbers, on separate lines, and prints their product.
Exercise 2.5 Write a program that prompts for and reads a string and a number (on separate lines) and prints the string the number of times indicated by the number (on separate lines).
Arrays and Lists Used interchangeably List variables @name List literals (“fred”,2,3) @primes = (2,3,5,7,11,13,17) @range = 1..10 Accessing elements: $primes[3] Length of a list: $#primes List assignment: ($p1, $p2, $p3) = (2,3,5)
List Operators @array = 1..5; The pop operator removes the last element of a list $last = pop(@array); @array = (1,2,3,4); $last=5 The push operator appends an element to the end of a list push(@array,5); @array = (1,2,3,4,5)
List Operators @array = 1..5; The shift operator removes the first element of a list $first = shift(@array); $first = 1; @array = (2,3,4,5) The unshift operator prepends an element to the beginning of a list unshift(@array,1); @array = (1,2,3,4,5)
List Operators @array = 1..5; The reverse operator reverses the elements of a list @rarray = reverse(@array); The sort operator sorts the elements of a list @sarray = sort(@rarray); @students = (“Sam”, “Fred”, “Anna”, “Sue”); print sort(@students);
foreach Control Structure foreach $i (1..10) { print “$i\n”; } foreach (1..10) { print “$_\n”;
Reading Lines #!/usr/bin/perl chomp(@lines = <STDIN>); # read lines, not newlines foreach $line (@lines) { print "$line\n"; }
Exercise 3.1 Write a program that reads a list of strings on separate lines until end-of-input and prints the list in reverse order.
Exercise 3.2 Write a program that reads a list of numbers on separate lines until end-of-input and then prints for each number the corresponding person’s name from the list fred betty barney dino wilma pebbles bamm-bamm
Exercise 3.3 Write a program that reads a list of strings on separate lines until the end-of-input. Then it should print the strings in alphabetical order.
Hashes An array that can be indexed by arbitrary strings $family_name{“fred”} = “flinstone; $family_name{“barney”} = “rubble”; foreach $person in ($barney, $fred) { print “Full name = $family_name{$person}\n”; }
Hashes The hash as a whole is referred to by a variable whose name starts with % %hash = (“barney”, “rubble”, “fred”, “flinstone”); %hash =(“barney” => “rubble”, “fred” => “flinstone”); @key-value-list = %hash
Hashes To obtain the keys in a hash To obtain the values in a hash @first_names = keys(%hash); To obtain the values in a hash @last_names = values(%hash);
The each Function You can loop over the key-value pairs in a hash while ( ($key, $value) = each %hash ) { print “$key => $value\n”; } The order is not specified – use sort if you care. foreach $key (sort keys %hash) { $value = $hash{$key};
The exists Function You can query to see if an entry with a given key has been inserted into a hash if (exists $last_name{$person}) { print “$person has a last name\n”; }
Deleting Entries from a Hash delete($family_name{fred});
Exercise 5.1 Write a program that will ask the user for a given name and report the corresponding family name.
Exercise 5.2 Write a program that reads a series of words (with one word per line) until end-of-input, then prints a summary of how many times each word was seen.