Skip to content

Perl Syntax Overview

Perl’s syntax draws inspiration from a variety of languages including C, awk, sed, and shell scripting. While it has a rich heritage, modern Perl development emphasizes clarity and robustness. This chapter will guide you through the essential syntax, incorporating current best practices.

A Perl program is a sequence of statements executed from top to bottom. Control structures like loops and subroutines allow for non-linear execution. Every simple statement must end with a semicolon (;). Complex statements, like control structures, have their own syntax rules for termination (usually a closing curly brace }).

Perl is a free-form language, meaning whitespace (spaces, tabs, newlines) is generally used to separate tokens and improve readability, not to define structure as in Python. However, consistent formatting is crucial for maintainable code.

It’s highly recommended to start every Perl script with the following lines:

use strict;
use warnings;

use strict; enforces stricter rules for your code, catching many common errors. use warnings; enables helpful diagnostic messages. Using these pragmas is a cornerstone of modern Perl programming.

You can execute Perl code directly from the command line using the -e option. This is handy for quick tests:

$ perl -e 'print "Hello, Modern Perl!\n"'

This will output:

Hello, Modern Perl!

For enabling features like say or strictures in one-liners, you can use -E (which implies use feature for enabled features) or -M to load modules:

$ perl -E 'say "Hello using say!"' # say automatically adds a newline
$ perl -Mstrict -e 'print "Strict mode test\n"'

Typically, you’ll write Perl programs in files. Create a file named hello.pl (e.g., using nano hello.pl or vim hello.pl) with the following content:

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say'; # Enables the 'say' function, available in Perl 5.10+
# This script prints a greeting.
say "Hello, Modern Perl World!";

The #!/usr/bin/env perl line is called a ‘shebang’. It tells the operating system to use the perl interpreter found in the user’s environment path, which is more portable than hardcoding /usr/bin/perl. Make the script executable and run it:

$ chmod +x hello.pl
$ ./hello.pl

This will produce the output:

Hello, Modern Perl World!

Parentheses for function arguments are often optional for built-in functions like print or say if the meaning is clear. However, for user-defined subroutines and for clarity, parentheses are generally recommended.

say "Hello without parentheses"; # Common for say/print
say("Hello with parentheses"); # Also fine, sometimes clearer
my_custom_function("argument1", "argument2"); # Recommended for user functions

Both say examples above produce the same output (each on a new line).

Perl scripts conventionally use the .pl extension. Perl modules (libraries of reusable code) use the .pm extension. While other extensions might work, adhering to these conventions is standard practice.

File names can contain letters, numbers, and underscores. Avoid spaces; use underscores instead (e.g., my_script.pl).

Comments are ignored by the Perl interpreter and are used to explain code. Single-line comments start with a hash symbol (#) and extend to the end of the line:

# This is a single-line comment.

Perl also supports Plain Old Documentation (POD) for multi-line comments or embedded documentation. POD blocks start with =begin identifier (or a common shortcut like =pod) and end with =cut.

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
# This is a regular comment.
say "Executable code here.";
=begin comment
This is a block comment using POD.
It can span multiple lines.
These lines are ignored by the interpreter.
=cut
say "More executable code.";

This program will output:

Executable code here.
More executable code.

Outside of quoted strings, Perl is flexible with whitespace. The following are equivalent to the interpreter:

say "Hello";
say "Hello" ;
say
"Hello"
;

However, consistent indentation and spacing are vital for readability. Inside quoted strings, whitespace is literal:

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
say "Hello world"; # Spaces are preserved
say "Hello\nworld"; # Newline character is interpreted

This will output:

Hello world
Hello
world

A line containing only whitespace, possibly with a comment, is a blank line and is ignored by Perl.

Quotes: Single, Double, and Quote-like Operators

Section titled “Quotes: Single, Double, and Quote-like Operators”

Perl offers several ways to quote strings. The most common are single (') and double (") quotes.

Double Quotes (""): Interpolate variables (replace variable names with their values) and escape sequences (like \n for newline, \t for tab).

Single Quotes (''): Treat content almost literally. No variable interpolation (except for \' and \\) and minimal escape sequence processing.

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
my $name = "Alice";
say "Hello, $name!\nWelcome."; # Double quotes: $name is replaced, \n is a newline
say 'Hello, $name!\nWelcome.'; # Single quotes: $name and \n are literal

This will produce:

Hello, Alice!
Welcome.
Hello, $name!\nWelcome.

Perl also provides quote-like operators: q{} (single-quoted), qq{} (double-quoted), qw{} (quote words - splits by whitespace into a list). These allow you to choose delimiters, which is useful if the string itself contains quotes.

my $path = q{/usr/local/bin}; # Like single quotes
my $message = qq{She said, "Hi!"}; # Like double quotes
my @words = qw{apple banana cherry}; # Creates ('apple', 'banana', 'cherry')

Here documents are a convenient way to create multi-line strings. The syntax is <<DELIMITER;, followed by lines of text, and terminated by DELIMITER on a line by itself.

If the delimiter is unquoted or double-quoted (e.g., <<EOF or <<"EOF"), variable interpolation and escape sequences work. If single-quoted (e.g., <<'EOF'), it behaves like a single-quoted string.

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
my $user = "Bob";
my $interpolated_doc = <<"END_MESSAGE";
Dear $user,
This is a message for you.
Thanks!
END_MESSAGE
my $literal_doc = <<'END_LITERAL';
Dear $user,
This will not interpolate $user.
END_LITERAL
say $interpolated_doc;
say "---";
say $literal_doc;

Output:

Dear Bob,
This is a message for you.
Thanks!
---
Dear $user,
This will not interpolate $user.

Note: The terminating delimiter must be on its own line, with no leading or trailing whitespace, unless you use the <<~DELIMITER syntax (Perl 5.26+) which allows indentation of the heredoc and its terminator.

The backslash (\) is Perl’s escape character. It gives special meaning to the character following it (e.g., \n for newline) or removes special meaning from a character (e.g., \$ to print a literal dollar sign).

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
my $price = 100;
say "The price is \$$price."; # Escape $ to print it literally
say "This is a path: C:\\Tools"; # Escape \ to print it literally

Output:

The price is $100.
This is a path: C:\Tools

An identifier is a name for a variable, function, etc. Perl variable names start with a sigil ($, @, %) indicating their type, followed by a letter or underscore, and then any combination of letters, numbers, or underscores.

Perl is case-sensitive. $myVar and $myvar are different variables. Punctuation characters (other than the initial sigil and underscores) are generally not allowed in identifiers.