Some pragmas:
use strict;
-- strict flags variables not declared with my,
as well as bareword strings at compile time
use integer;
-- forces match operations to be done in integer
10/3 now returns 3, not 3.333..
use diagnostics;
-- compiler messages now more verbose along with turning on -w
The default package (main):
use strict;
$sum = 0;
# Global symbol "sum" requires explicit package name at ./largest2.plx line 9.
# expects sum to come from another package, can eliminate using
# my($sum) = 0;
# or
# $main::sum = 0;
Examples of modules (see Chapter 7, Programming Perl):
use English;
-- allows you to use English Names for many special variables
e.g., instead of $& use $MATCH
$` $PREMATCH
$' $POSTMATCH
(a full list is on Prog. Perl, p. 403)
use Env;
-- gives access to environment variables like and allows them
to be treated as simple variables (e.g., $HOSTNAME, $PATH,
$USER etc.) rather than by using the %ENV hash
Example of use of a class from a module:
use Math::Complex;
# under UNIX, will look for module Math/Complex.pm
# in some standard paths
o a module generally defines a particular type called a CLASS
# in this case, the class is Math::Complex
o the module provides a way to create instantiations of the
class, called OBJECTS,
$cnum1 = Math::Complex->new(1,1);
# called a CLASS METHOD; called as
# <classname>-><method>(<params>)
# new() is the name often given to
# an object constructor
# new IS NOT a built-in function in Perl
$x = 2;
$y = 3;
$cnum2 = new Math::Complex($x,$y);
# another way to call new
o module has other functions called OBJECT METHODS which
operate on objects of the class
# examples of object methods;
# called as
# <objectname>-><method>(<params>)
$x = $cnum1->Re(); # returns real portion
$y = $cnum1->Im(); # returns imaginary portion
o some modules overload operators
# create an empty complex number object
$cnum3 = Math::Complex->new();
$cnum3 = $cnum1 + $cnum2;
Creation of Hard References
-- backslash operator (functions much like & in C/C++)
$ref_scalar = \$scalar;
$ref_array = \@array;
$ref_hash = \%hash;
$ref_sub = \&subname;
-- ANONYMOUS ARRAY COMPOSER
$ref_array = [$a, $b, $c];
# reference to an unnamed array consisting of
# of the values of $a, $b, and $c at the time of creation
# contrast with
@array_of_refs = \($a, $b, $c);
# a three element array containing references
# to $a, $b, and $c
# same as
@array_of_refs = (\$a, \$b, $\c);
-- ANONYMOUS HASH COMPOSER
$ref_hash = { # note the brackets!
lunch => 'noon',
dinner => 'six pm'
};
Using Hard References
$c = 3;
$ref_scalar = \$c;
# rightmost $ dereferences, leftmost $ indicates scalar value
$value = $$ref_scalar; # $value is 3
# could also write
$value = ${$ref_scalar}; # same as above
$ref_array = [1, 2, 3];
$$ref_array[2] = 4;
# the following produces the same result
# it says $ref_array is a reference;
# dereference it and return the second element
# of the result (it always defaults to a scalar
# context -- i.e., always returns a scalar value)
$ref_array->[2] = 4;
print("@$ref_array\n"); # prints 1 2 4<newline>
$$ref_hash{'breakfast'} = 'seven am';
@meals = keys(%$ref_hash);
$c = &$ref_sub(2); # calls a sub
To illustrate the difference between [ and \(:
$a = 1; $b = 2; $c = 3;
$ref_array = [$a, $b, $c];
# assign 100 to the first array location
$$ref_array[0] = 100;
print("@$ref_array\n");
print("$a\n");
# 100 2 3
# 1
@array_of_refs = \($a, $b, $c);
# note $$array_of_refs[0] == ${$array_of_refs}[0],
# which would be incorrect because @array_of_refs
# is NOT a reference; therefore, must use {}
${$array_of_refs[0]} = 100;
# assign 100 to the location referred to
# by the first element of the array
foreach $ref (@array_of_refs) {
print ($$ref, " ");
}
print("\n");
print("$a\n");
# 100 2 3
# 100
Passing References as Parameters
($ref_first, $ref_second) = order_by_means(\@a, \@b);
print("First: @$ref_first\n");
print("Second: @$ref_second\n");
sub order_by_means {
my($ref_a) = $_[0];
my($ref_b) = $_[1];
my($mean_a) = calc_mean($ref_a);
my($mean_b) = calc_mean($ref_b);
if ($mean_a > $mean_b) {
return ($ref_b, $ref_a);
}
else {
return ($ref_a, $ref_b);
}
}
sub calc_mean {
my($ref_array) = $_[0];
my($sum) = 0;
if ( @$ref_array == 0 ) {
return 0;
}
foreach $elem (@$ref_array) {
$sum += $elem;
}
return ( $sum / @$ref_array ) ;
}
Passing Filehandles as Parameters:
o special syntax used (typeglob)
$rec = get_rec(\*STDIN);
sub get_rec {
my($handle) = $_[0];
return (scalar <$handle>);
}