Perl is a highly capable, feature-rich programming language with over 25 years of development. These notes follow the path of the Learning Perl book.
@ARGV contains arguments, $0 contains program name.die/warn can be used to exit/warn, $! will contain any system error message. Without \n at the end, perl will append line number to error message.undef before being assigned. undef acts as a 0 or “” as needed, but will throw a warning if printed.defined() checks if a variable has been defined. Can also set a variable to undef.(), the empty list and not undef.$myarr[0] - undef if never set.$#arr('abc','def') or (1..6) (integers 1 to 6) or qw(abc def) or qw#abc def# (quoted by whitespace).($fred, $barney, $dino) = ("flintstone", "rubble", undef); ($fred, $barney) = ($barney, $fred); # swap those values
push adds element(s) to end of array. pop removes a single element and returns it.unshift adds element(s) to start of array. shift removes a single element and returns it.splice removes elements from middle of array, returns them and optionally replaces them splice @arr, start, len, @newelems
sort and reverse functions return the modified list (can be saved to original array variable).scalar function forces a scalar context e.g. for print function.%hash has its own namespace.$hash{$some_key} to access a value (curly-braces instead of square braces).%some_hash = ('a', 1, 'b', 2, 'c', 3); %some_hash = ( 'a' => 1, 'b'=>2, 'c'=>3,);
%some_hash = ( a => 1}; $some_hash{a};
%revhash = reverse %hash to reverse a hash (for non-unique values, last one wins).keys %hash; and values %hash; return a list of keys or value in same order (or # of keys/values in scalar context). %hash' is true only if hash has at least one key-value pair.
* To iterate over hash : <code perl>while ( ($key, $value) = each %hash ) {
print “$key ⇒ $value\n”; }</code> or in order of keys <code perl>foreach $key (sort keys %hash) {
print “$key ⇒ $hash{$key}\n”; } </code>
* %ENV hash holds environment variables.
===== Control Structures =====
* if-elsif-else <code perl>if ($a == $b) {
a = 0;
} elsif ($a > $b) {
a = 1;
} else {
a = -1;
}</code>
* while loop <code perl>$count=0;
while ($count < 10) {
$count += 2;
}</code>
* foreach loop <code perl>foreach my $rock (@rocks) {
# modifications to $rock modify the list element
# $_ is used if loop variable is omitted
}</code>
===== Input/Output =====
* Read a line of input - $line = <STDIN>;
* chomp removes a newline e.g. chomp($line=<STDIN>);
* Assigning <STDIN> to a list reads all input up till EOF e.g. <code perl> chomp(@lines = <STDIN>);</code>
* Loop over input ($_ can only be used in this specific case) <code perl>while (<STDIN>) {
print “I saw $_”;
}</code>
* foreach can also be used but uses more memory since it reads all input into memory first.
* <> iterates over all files in @ARGV (or STDIN if no args) like e.g. cat/sed/awk. <code perl>while (<>) {
chomp;
print LOGFILE “It was $_ that I saw!\n”;
}</code>
* print takes list of items and sends all to STDOUT (unseparated). print @array; vs print “@array”; <code perl>print <>; # source code for 'cat'
print sort <>; # source code for 'sort'</code>
* C-like printf function %g for number auto-format,%10s, %-10d etc.<code perl>my @items = qw( wilma dino pebbles );
my $format = “The items are:\n” . (“%10s\n” x @items);
printf $format, @items;
printf “The items are:\n”.(“%10s\n” x @items), @items;
</code>
* Filehandles can be barewords (upper-cased) or variables. Special filehandles are : STDIN, STDOUT, STDERR, DATA, ARGV, and ARGVOUT .<code perl>open CONFIG, '<dino'; # < is optional
open BEDROCK, '>fred' || die “Cannot open fred: $!”;
open LOG, '»:encoding(UTF-8)','logfile'; # for perl >= 5.6
open my $bedrock, '>:crlf', $file_name; # DOS-formatted output
binmode STDOUT, ':encoding(UTF-8)';</code>
* select can be used to change default output filehandle. $| = 1; unbuffers currently selected output.
===== User Subroutines =====
* Subroutines are in their own namespace and are typically called using &mysub (sometimes the ampersand can be omitted).
* Subroutines can be defined anywhere e.g. <code perl> sub mysub {
my($m, $n) = @_
$m + $n;
} </code>
* The value of the last expression evaluated is returned. But return $a; can be used to return immediately.
* A list can be returned if the subroutine is called in a list context (wantarray can be used to detect list or scalar context).
* Arguments are in the list @_ . If &mysub; is used, the parent's argument list is inherited.
* Lexical scoped variables can be used in any block by prefixing with my.
* In Perl 5.10 and up state $x;'' can be used to declare a private variable that keep state between calls.