This is a basic tutorial on Perl. The goal is to get a quick working understanding of the language. Examples on this page are based on Perl 5.14.2. (released on )
in Perl, every variable name must start with one of {$ @ %}.
$ means the VALUE of the variable is a “scalar”. i.e. string, number.@ means the VALUE of the variable is a array.% means the VALUE of the variable is a hash table (aka dictionary, associative list.).# -*- coding: utf-8 -*- # perl use Data::Dumper; # for printing array and hash $Data::Dumper::Indent = 0; # set to print compact $a = 4; # scalar @a = (1, 2, 3); # array %a = ('e' => 4, 'f' => 5, 'g' => 6); # hash print $a, "\n"; # 4 print Dumper(\@a), "\n"; # $VAR1 = [1,2,3]; print Dumper(\%a), "\n"; # $VAR1 = {'e' => 4,'g' => 6,'f' => 5};
Use single quote for literal string.
# -*- coding: utf-8 -*- # perl # use single quote for literal string $a = 'this and that'; print $a; # prints 2 lines
To have characters \n for newline and \t for tab, use double quote.
# -*- coding: utf-8 -*- # perl $a = "this\nand that"; print $a; # prints 2 lines
When double quote is used, variables inside the string will be evaluated.
# -*- coding: utf-8 -*- # perl $a = 4; $b = "this is $a"; print $b; # this is 4
Summery: 2 major ways to quote strings strings: single quote and double quote.
'single quote' → everything is literal."double quote" → backslash is a char escape, and variables inside it will be evaluated.You can also use the syntax q(this n that), which is equivalent to 'this n that'.
The parenthesis can be curly brackets {} or square brackets []. It can also be / \ | @ and most others ASCII symbols.
# -*- coding: utf-8 -*- # perl # the following are all same $a = q(this 'n' that); $b = q[this 'n' that]; $c = q{this 'n' that}; $d = q|this 'n' that|; $e = "this 'n' that"; $f = 'this \'n\' that';
Similarly, "…" is same as qq(…).
substr(‹string›, ‹offset›, ‹number of chars to extract›).
# -*- coding: utf-8 -*- # perl # get substring print substr('012345', 2, 2); # prints 23
Length of string is length(‹string›).
print length('abc');
use dot to join string.
# -*- coding: utf-8 -*- # perl $s = "a" . "b"; print $s; # ab
String repetition is done with the operator x.
# -*- coding: utf-8 -*- # perl print 'abc' x 2; # abcabc
〔☛ Python, Ruby, Perl: Basic String Operations〕
Perl does not have a boolean type. Basically, anything that seems should be false, is false. (of course, it can be tricky). The following are false:
undef"" empty stringEverything else is true.
Perl does automatic conversion between number and string, so '0' is false in some contexts because it converts to 0. But '0.0' is true, because it remains a string, and is not empty string.
The value of Perl's {array, list, hash}, depends on context (what's adjacent to it), and is not very intuitive.
The best thing is to test what you need exactly. For example, check if the length of a list is 0, or whether a var has value 0, or whether it is undef.
# -*- coding: utf-8 -*- # perl use strict; if (0) { print "yes"} else { print "no"} # ⇒ no if (0.0) { print "yes"} else { print "no"} # ⇒ no if ("0") { print "yes"} else { print "no"} # ⇒ no if ("") { print "yes"} else { print "no"} # ⇒ no if (undef) { print "yes"} else { print "no"} # ⇒ no
# -*- coding: utf-8 -*- # perl use strict; # empty array is false my @myArray = (); if (@myArray) { print "yes"} else { print "no"} # ⇒ no
# -*- coding: utf-8 -*- # perl use strict; # empty hash is false my %myHash = (); if (%myHash) { print "yes"} else { print "no"} # ⇒ no
# -*- coding: utf-8 -*- # perl use strict; if (1) { print "yes"} else { print "no"} # ⇒ yes if ("0.0") { print "yes"} else { print "no"} # ⇒ yes if (".0") { print "yes"} else { print "no"} # ⇒ yes
# -*- coding: utf-8 -*- # perl use strict; # examples of explicit testing my $x = 5; my $y; if (defined($x)) { print "yes"} else { print "no"} # ⇒ yes if (defined($y)) { print "yes"} else { print "no"} # ⇒ no if ($x == 0) { print "yes"} else { print "no"} # ⇒ no
# -*- coding: utf-8 -*- # perl use strict; # testing array length my @myArray = (); my $myArrayLength = scalar @myArray; if ($myArrayLength == 0) { print "yes"} else { print "no"} # ⇒ yes
#-*- coding: utf-8 -*- # perl # Examples of if $x = 1; if ($x == 1) { print "x yes\n"; } $y = 2; if ($y == 1) { print "y yes\n"; } else { print "y no\n"; } $z = 2; if ($z < 0) { print 'z neg'; } elsif ($z == 0) { print 'z zero'; } elsif ($z == 1) { print 'z one'; } else { print 'z other'; }
#-*- coding: utf-8 -*- # perl @aa = (1..9); # creates a array 1 to 9 for $xx (@aa) { print $xx } # ⇒ 123456789
Note: Perl also supports loop controls “next”, “last”, “goto” and few others.
#-*- coding: utf-8 -*- # perl for $xx (1..9) { print $xx; if ($xx == 4) { last; # break } } # ⇒ 1234
#-*- coding: utf-8 -*- # perl $x = 1; while ($x <= 9) { print $x, "\n"; $x++; }
# -*- coding: utf-8 -*- # perl @a = (0, 1, 2, 'three', 4, 5, 6, 7); # assigns a list to @a. use Data::Dumper; # loads the list-printing module print '@a is:', Dumper(\@a);
The backslash in front of @a is necessary. It returns the “reference” of the array @a, and the argument to Dumper must be a reference. Once a list is assigned to a variable, it's called array.
Perl's concept of “list” and “array” is a bit complex. Basically, when a list is assigned to a variable, it's a array. For detail, see: Perl List vs Array — the Nether Mumble Jumble
To find the number of elements in a list, use “scalar”.
# -*- coding: utf-8 -*- # perl @a = (4, 5, 6); # a list print scalar(@a); # prints 3. The length. print @a + 0; # prints 3. The 「+」 forces a scalar context.
Perl has a “list context” and “scalar context”. How things are evaluated depends on whether the thing is in list or scalar context. When a list/array is in a scalar context, it returns its length. The function scalar forces things in a scalar context.
To add a element, or join two lists, use push(‹array›, ‹new item›).
# -*- coding: utf-8 -*- # perl use Data::Dumper; @b = (1, 9); push(@b, 3); # add a element to @b, at the end print Dumper(\@b); # [1, 9, 3]
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a = (1, 9); @b = (3, 4); @c = (); push(@c, @a, @b); # @c is the joined list of @a and @b print Dumper(\@c); # [1, 9, 3, 4]
Perl automatically flatten array/lists, even if the new item added to list is a list. To force creating a nested list, you have to use square brackets, like this:
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a = (1, 9); @b = (5, 6); # create nested list push(@a, [@b]); print Dumper(\@a); # [1, 9, [3, 4]]
Square brackets actually creates a reference to a array.
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a = (1, 8); # array $b = [1, 8]; # reference to array print Dumper(\@a); # [1, 8] print Dumper($b); # [1, 8]
To extract list element, append with [‹index›]. The index can be several integers separated by comma, for getting multiple elements.
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a = (0, 1, 2, 'three', 4, 5, 6, 7); @b = @a[3, 1, 5]; # ['three', 1, 5] $c = @a[2]; # gets 2 print Dumper \@b; # ['three', 1, 5] print $c, "\n"; # 2
Here a example of extracting sublist (aka slice).
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a = (0, 1, 2, 'three', 4, 5, 6, 7); @b = @a[1..4]; # the 1..4 creates a range print Dumper \@b; # [1, 2, 'three', 4]
To replace parts, just assign them. ⁖ $myArray[3] = "heart";.
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a = (0, 1, 2, 'three', 4); $a[3] = 'new'; print Dumper(\@a); # [ 0, 1, 2, 'new', 4 ]
Note the dollar sign $ above. This tells Perl that this data is a “scalar” as opposed to a “multiple”. In Perl, a variable of “scalar” type (such as numbers and strings) starts with a $. A variable for array (aka list) starts with the sign @. A variable for harshes/dictionaries starts with %. All Perl variables must start with one of {$ @ %}. (this is a simplified story)
To create a nested list, use square brackets for the inner list.
# -*- coding: utf-8 -*- # perl use Data::Dumper; @b = (4, 5, [1, 2, [9, 8]], 7); # nested list print Dumper \@b; # [ 4, 5, [ 1, 2, [ 9, 8 ] ], 7 ]
You can embed a array as a nested list into another array. ⁖ @b = (4, 5, \@myarray, 7).
# -*- coding: utf-8 -*- # perl use Data::Dumper; @a=(1, 2, 3); @b = (4, 5, \@a, 7); # embed @a as sublist. print '@b', Dumper \@b; # [ 4, 5, [ 1, 2, 3 ], 7 ]
To extract element from nested list, use this form: $‹array name›[‹first level index›]->[‹2nd level index›]->[‹3rd level index›]….
# -*- coding: utf-8 -*- # perl use Data::Dumper; @b = (1, 2, ['x', 'y'], 3); $c = $b[2]->[1]; print $c; # 'y' @b = (1, 2, ['x', [4, 5], 7], 3); $c = $b[2]->[1]->[1]; print $c; # 5
Python, Ruby, Perl: List Basics
In Perl, keyed-list is called hash table, or just hash. It is done like this:
# -*- coding: utf-8 -*- # perl use Data::Dumper qw(Dumper); # load the Dumper function for printing array/hash $Data::Dumper::Indent = 0; # make it print in compact style # hash table %hh = ('john'=>3, 'mary'=> 4, 'jane'=> 5, 'vicky'=>7); print Dumper \%hh; # {'jane' => 5,'john' => 3,'vicky' => 7,'mary' => 4}
The line use Data::Dumper qw(Dumper); loads the function “Dumper” from the package “Data::Dumper”.
The purpose of Dumper is to print array and hash.
Variable of hash datatype must begin with % in their name.
# -*- coding: utf-8 -*- # perl use Data::Dumper qw(Dumper); # for printing list or hash %hh = ('john' =>3, 'mary' => 4, 'jane' => 5, 'vicky' => 7); print Dumper \%hh; # get value from a key print $hh{'mary'}; # 4 # delete a entry delete $hh{'vicky'}; print Dumper \%hh; # { 'jane' => 5, 'john' => 3, 'mary' => 4 } # get all keys print Dumper [keys %hh]; # [ 'jane', 'john', 'mary' ] # get all values (Perl 5.12. released in 2010) print Dumper [values %hh]; # [ 5, 3, 4] # check if a key exists print exists $hh{'mary'}; # returns 1, meaning true.
If you are going to get values of a hash, you use $ in front of the hash variable. ⁖ $b{'mary'}.
The Dumper function's argument needs to be a “reference” to
the hash.
So, you can use it like this:
Dumper(\%b)
or
Dumper([%b]).
(parenthesis is usually optional)
〔☛ Python, Ruby, Perl: Dictionary, Hash〕
Use “grep” to remove elements in a list. The form is one of:
grep {‹true/false function name› $_} ‹array›grep {‹expression on $_› ;} ‹array›Example:
# -*- coding: utf-8 -*- # perl use Data::Dumper; sub ff {return $_[0] % 2 == 0}; # return true if divisible by 2 print Dumper[ grep {ff $_} (0..10)]; # ⇒ [ 0, 2, 4, 6, 8, 10 ]
@_ → a builtin variable that's all the arguments passed to a subroutine, as array. So, $_[0] is the first argument passed.$_ → a builtin variable that's the default input for regex to match, and in general represents a default argument.The (0..10) generate a list from 0 to 10.
The % above is the operator for computing remainder of a division.
The Data::Dumper module is to import the “Dumper” function for printing list.
Use “map” to apply a function to a list. The basic form is map {‹function name›($_)} ‹list›. It returns a list.
# -*- coding: utf-8 -*- # perl use Data::Dumper; $Data::Dumper::Indent=0; sub ff {return ($_[0])**2;}; # square a number print Dumper [ map { ff($_)} (0..10)]; # ⇒ $VAR1 = ['0','1','4',9,'16',25,36,49,'64',81,100];
The ** is the exponential operator.
〔☛ Python, Ruby, Perl: Apply a Function to a List〕
In Perl, a library is called a module. The standard filename suffix is “.pm”.
For a script, the filename suffix is “.pl”.
To get a list of standard module that are bundled with Perl (but not necessarily installed). perldoc perlmodlib..
To load a package, call use ‹package name›;. It will import all functions in that package. Example:
# -*- coding: utf-8 -*- # perl # loading some commonly used packages use Data::Dumper; # for printing list and hash use File::Find; # for traversing directories
To find out what functions are available in a module, read its documentation, for example perldoc Data::Dumper.
Here is a example showing module paths and loaded modules:
# -*- coding: utf-8 -*- # perl use Data::Dumper; print Dumper \@INC; # prints all module searching paths print Dumper \%INC; # prints all loaded modules __END__ sample output: $VAR1 = [ '/etc/perl', '/usr/local/lib/perl/5.12.4', '/usr/local/share/perl/5.12.4', '/usr/lib/perl5', '/usr/share/perl5', '/usr/lib/perl/5.12', '/usr/share/perl/5.12', '/usr/local/lib/site_perl', '.' ]; $VAR1 = { 'warnings/register.pm' => '/usr/share/perl/5.12/warnings/register.pm', 'bytes.pm' => '/usr/share/perl/5.12/bytes.pm', 'XSLoader.pm' => '/usr/share/perl/5.12/XSLoader.pm', 'Carp.pm' => '/usr/share/perl/5.12/Carp.pm', 'Exporter.pm' => '/usr/share/perl/5.12/Exporter.pm', 'strict.pm' => '/usr/share/perl/5.12/strict.pm', 'warnings.pm' => '/usr/share/perl/5.12/warnings.pm', 'overload.pm' => '/usr/share/perl/5.12/overload.pm', 'Data/Dumper.pm' => '/usr/lib/perl/5.12/Data/Dumper.pm' };
For more info about the predefined variables @INC and %INC.
perldoc perlvar
〔☛ Python & Perl: Using Modules/Packages/Library〕
Here is a example of defining a function.
# -*- coding: utf-8 -*- # perl use Data::Dumper; $Data::Dumper::Indent = 0; # print in compact style # define a function sub ff { $a = $_[0]; # get first arg $b = $_[1]; # get second arg # arguments are automatically assigned to array @_ print Dumper(\@_); # prints the array @_ # use “return” to return value and exit the function return $a + $b; } ff(3, 4, "rabbit"); # $VAR1 = [3,4,'rabbit'];
Note: Unlike most other languages, subroutine's parameters are USUALLY not declared.
Arguments are automatically assigned to the array @_. So, $_[0] is the first element of the array @_. The @_ a builtin variable.
To define a function with optional parameters, just use defined($_[n]) to check if the argument is given.
# -*- coding: utf-8 -*- # perl # myFun(x,y) returns x+y. y is optional and default to 1. sub myFun { $x = $_[0]; if (defined $_[1]) { $y = $_[1]; } else { $y = 1; } return $x+$y; } print myFun(3); # 4
For another example, see: Python & Perl: Defining A Function ◇ Python, Ruby, Perl: Defining A Function
In the following, i show you how to write a library in Perl by a example.
Save the following 3 lines in a file and name it 〔mymodule.pm〕.
# -*- coding: utf-8 -*- # perl package mymodule; # declaring the module sub f1($){$_[0]+1} # module body 1 # module must return a true value
Then, call it like the following way:
# -*- coding: utf-8 -*- # perl use mymodule; # import the module print mymodule::f1(5); # call the function
This is the simplest illustration of writing a package in Perl and calling its function.
In Perl, there are 2 different concepts for a set of code that resides in a file: “module” and “package”.
A “module” is simply a file of Perl code. To load a module, use require ‹file name›. It is similar to “include” in C and PHP. A module file normally has suffix “.pl”.
A “package” in Perl is more modern meaning of a library. It is a mechanism of importing functions defined in a external file, using name spaces. Package files has “.pm” as suffix. A package file needs to start with package filename; and must return a value true (any number, string, as the last line will do).
Perl's module was there before it had a real library system. You should just write packages.
Python & Perl: Writing A Module