The Perl programming language offers expanded control of the interpreter by use of pragmas, directives that change the way programs and data are interpreted. This page describes pragmas in Perl 5, and how to use them.

Description

In perl (as in all programming languages), a “pragma” is a directive that specifies how the compiler (or in perl’s case, the interpreter) should process its input. They are not part of the language per se, but are a sort of command-line option that tells the interpreter how to behave. The following is a list of the pragmas available in perl:

  • Description
  • Linux perl command overview
  • Linux commands help

attributes

The attributes pragma gets or sets subroutines or variable attributes.

Example

sub foo : method ; my ($x,@y,%z) : Bent = 1; my $s = sub : method { … }; use attributes (); # optional, to get subroutine declarations my @attrlist = attributes::get(&foo); use attributes ‘get’; # import the attributes::get subroutine my @attrlist = get &foo;

autodie

The autodie pragma replaces functions with ones that succeed or die with lexical scope.

use autodie; # Recommended: implies ‘use autodie qw(:default)’ use autodie qw(:all); # Recommended more: defaults and system/exec. use autodie qw(open close); # open/close succeed or die open(my $fh, “<”, $filename); # No need to check! { no autodie qw(open); # open failures won’t die open(my $fh, “<”, $filename); # Could fail silently! no autodie; # disable all autodies }

autouse

The autouse pragma postpones the loading of modules until a function is used.

use autouse ‘Carp’ => qw(carp croak); carp “this carp was predeclared and autoused “;

base

The base pragma establishes an ISA relationship with base classes at compile time.

package Baz; use base qw(Foo Bar);

bigint

The bigint pragma offers transparent BigInteger support for Perl.

use bigint; $x = 2 + 4.5,"\n”; # BigInt 6 print 2 ** 512,"\n”; # really is what you think it is print inf + 42,"\n"; # inf print NaN * 7,"\n"; # NaN print hex(“0x1234567890123490”),"\n"; # Perl v5.10.0 or later { no bigint; print 2 ** 256,"\n"; # a normal Perl scalar now }

Import into current package:

use bigint qw/hex oct/; print hex(“0x1234567890123490”),"\n"; print oct(“01234567890123490”),"\n";

bignum

The bignum pragma offers transparent BigNumber support for Perl.

use bignum; $x = 2 + 4.5,"\n"; # BigFloat 6.5 print 2 ** 512 * 0.1,"\n"; # really is what you think it is print inf * inf,"\n"; # prints inf print NaN * 3,"\n"; # prints NaN { no bignum; print 2 ** 256,"\n"; # a normal Perl scalar now }

for older Perls, import into current package:

use bignum qw/hex oct/; print hex(“0x1234567890123490”),"\n"; print oct(“01234567890123490”),"\n";

bigrat

The bigrat pragma offers transparent BigNumber/BigRational support for Perl.

use bigrat; print 2 + 4.5,"\n"; # BigFloat 6.5 print 1/3 + 1/4,"\n"; # produces 7/12 { no bigrat; print 1/3,"\n"; # 0.33333… }

Import into current package:

use bigrat qw/hex oct/; print hex(“0x1234567890123490”),"\n"; print oct(“01234567890123490”),"\n";

blib

The blib pragma uses MakeMaker’s uninstalled version of a package.

perl -Mblib script [args…] perl -Mblib=dir script [args…]

bytes

The bytes pragma forces byte semantics rather than character semantics.

use bytes; … chr(…); # or bytes::chr … index(…); # or bytes::index … length(…); # or bytes::length … ord(…); # or bytes::ord … rindex(…); # or bytes::rindex … substr(…); # or bytes::substr no bytes;

charnames

The charnames pragma accesses Unicode character names and named character sequences; it also defines character names.

use charnames ‘:full’; print “\N{GREEK SMALL LETTER SIGMA} is called sigma.\n”; print “\N{LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW}”, " is an officially named sequence of two Unicode characters\n"; use charnames ‘:loose’; print “\N{Greek small-letter sigma}”, “can be used to ignore case, underscores, most blanks,” “and when you aren’t sure if the official name has hyphens\n”; use charnames ‘:short’; print “\N{greek:Sigma} is an upper-case sigma.\n”; use charnames qw(cyrillic greek); print “\N{sigma} is Greek sigma, and \N{be} is Cyrillic b.\n”; use utf8; use charnames “:full”, “:alias” => { e_ACUTE => “LATIN SMALL LETTER E WITH ACUTE”, mychar => 0xE8000, # Private use area “自転車に乗る人” => “BICYCLIST” }; print “\N{e_ACUTE} is a small letter e with an acute.\n”; print “\N{mychar} allows me to name private use characters.\n”; print “And I can create synonyms in other languages,”, " such as \N{自転車に乗る人} for “BICYCLIST (🚴, U+1F6B4)\n”; use charnames (); print charnames::viacode(0x1234); # prints “ETHIOPIC SYLLABLE SEE” printf “%04X”, charnames::vianame(“GOTHIC LETTER AHSA”); # prints # “10330” print charnames::vianame(“LATIN CAPITAL LETTER A”); # prints 65 on # ASCII platforms; # 193 on EBCDIC print charnames::string_vianame(“LATIN CAPITAL LETTER A”); # prints “A”

constant

The constant pragma is used to declare constants.

use constant PI => 4 * atan2(1, 1); use constant DEBUG => 0; print “Pi equals “, PI, “…\n” if DEBUG; use constant { SEC => 0, MIN => 1, HOUR => 2, MDAY => 3, MON => 4, YEAR => 5, WDAY => 6, YDAY => 7, ISDST => 8, }; use constant WEEKDAYS => qw( Sunday Monday Tuesday Wednesday Thursday Friday Saturday ); print “Today is “, (WEEKDAYS)[ (localtime)[WDAY] ], “.\n”;

diagnostics

The diagnostics pragma and splain standalone filter program produce verbose warning diagnostics.

Using the diagnostics pragma:

use diagnostics; use diagnostics -verbose; enable diagnostics; disable diagnostics;

Using the splain standalone filter program:

perl program 2>diag.out splain [-v] [-p] diag.out

Using diagnostics to get stack traces from a misbehaving script:

perl -Mdiagnostics=-traceonly my_script.pl

encoding

The encoding pragma lets you write your script in non-ascii or non-utf8.

use encoding “greek”; # Perl like Greek to you? use encoding “euc-jp”; # Jperl!

or you can even do this if your shell supports your native encoding

perl -Mencoding=latin2 -e’…’ # Feeling centrally European? perl -Mencoding=euc-kr -e’…’ # Or Korean?

more control

A simple euc-cn => utf-8 converter

use encoding “euc-cn”, STDOUT => “utf8”; while(<>){print};

“no encoding;” supported (but not scoped!)

no encoding;

an alternate way, Filter

use encoding “euc-jp”, Filter=>1;

now you can use kanji identifiers – in euc-jp!

switch on locale -

note that this probably means that unless you have complete control

over the environments the application is ever going to run in, you should

NOT use the feature of encoding pragma allowing you to write your script

in any recognized encoding because changing locale settings wrecks

the script; you can of course still use the other features of the pragma.

use encoding ‘:locale’;

feature

The feature pragma is used to enable new features.

This module is deprecated under perl 5.18. It uses a mechanism provided by perl that is deprecated under 5.18 and higher, and may be removed in a future version.

use feature qw(say switch); given ($foo) { when (1) { say “$foo == 1” } when ([2,3]) { say “$foo == 2 || $foo == 3” } when (/^a[bc]d$/) { say “$foo eq ‘abd’ || $foo eq ‘acd’” } when ($_ > 100) { say “$foo > 100” } default { say “None of the above” } } use feature ‘:5.10’; # loads all features available in perl 5.10 use v5.10; # implicitly loads :5.10 feature bundle

fields

The fields pragma defines compile-time class fields.

{ package Foo; use fields qw(foo bar _Foo_private); sub new { my Foo $self = shift; unless (ref $self) { $self = fields::new($self); $self->{_Foo_private} = “this is Foo’s secret”; } $self->{foo} = 10; $self->{bar} = 20; return $self; } } my $var = Foo->new; $var->{foo} = 42;

this will generate an error

$var->{zap} = 42;

subclassing

{ package Bar; use base ‘Foo’; use fields qw(baz _Bar_private); # not shared with Foo sub new { my $class = shift; my $self = fields::new($class); $self->SUPER::new(); # init base fields $self->{baz} = 10; # init own fields $self->{_Bar_private} = “this is Bar’s secret”; return $self; } }

filetest

The filetest pragma controls the filetest permission operators.

$can_perhaps_read = -r “file”; # use the mode bits { use filetest ‘access’; # intuit harder $can_really_read = -r “file”; } $can_perhaps_read = -r “file”; # use the mode bits again

if

The if pragma uses a Perl module if a condition holds.

use if CONDITION, MODULE => ARGUMENTS;

integer

The integer pragma tells perl to use integer arithmetic instead of floating point.

use integer; $x = 10/3;

$x is now 3, not 3.33333333333333333

less

The less pragma is used to instruct perl to request less of a certain resource.

use less ‘memory’; use less ‘CPU’; use less ‘fat’;

lib

The lib pragma is used to manipulate @INC at compile time.

use lib LIST; no lib LIST;

locale

The locale pragma uses (or avoids) POSIX locales for built-in operations.

@x = sort @y; # Unicode sorting order { use locale; @x = sort @y; # Locale-defined sorting order } @x = sort @y; # Unicode sorting order again

mro

The mro pragma defines method resolution order.

use mro; # enables next::method and friends globally use mro ‘dfs’; # enable DFS MRO for this class (Perl default) use mro ‘c3’; # enable C3 MRO for this class

open

The open pragma sets default PerlIO layers for input and output.

use open IN => “:crlf”, OUT => “:bytes”; use open OUT => ‘:utf8’; use open IO => “:encoding(iso-8859-7)”; use open IO => ‘:locale’; use open ‘:encoding(utf8)’; use open ‘:locale’; use open ‘:encoding(iso-8859-7)’; use open ‘:std’;

ops

The ops pragma restricts unsafe operations when compiling.

perl -Mops=:default … # only allow reasonably safe operations perl -M-ops=system … # disable the ‘system’ opcode

overload

The overload pragma is used to overload perl operations.

package SomeThing; use overload ‘+’ => &myadd, ‘-’ => &mysub; # etc … package main; $a = SomeThing->new( 57 ); $b = 5 + $a; … if (overload::Overloaded $b) {…} … $strval = overload::StrVal $b;

overloading

The overloading pragma lexically controls overloading.

{ no overloading; my $str = “$object”; # doesn’t call stringification overload }

it’s lexical, so this stringifies:

warn “$object”;

it can be enabled per op

no overloading qw(””); warn “$object”;

and also reenabled

use overloading;

parent

The parent pragma establishes an ISA relationship with base classes at compile time.

package Baz; use parent qw(Foo Bar);

re

The re pragma alters regular expression behavior.

use re ’taint’; ($x) = ($^X =~ /^(.)$/s); # $x is tainted here $pat = ‘(?{ $foo = 1 })’; use re ’eval’; /foo${pat}bar/; # won’t fail (when not under -T # switch) { no re ’taint’; # the default ($x) = ($^X =~ /^(.)$/s); # $x is not tainted here no re ’eval’; # the default /foo${pat}bar/; # disallowed (with or without -T # switch) } use re ‘/ix’; “FOO” =~ / foo /; # /ix implied no re ‘/x’; “FOO” =~ /foo/; # just /i implied use re ‘debug’; # output debugging info during /^(.*)$/s; # compile and run time use re ‘debugcolor’; # same as ‘debug’, but with colored # output … use re qw(Debug All); # Same as “use re ‘debug’”, but you # can use “Debug” with things other # than ‘All’ use re qw(Debug More); # ‘All’ plus output more details no re qw(Debug ALL); # Turn on (almost) all re debugging # in this scope use re qw(is_regexp regexp_pattern); # import utility functions my ($pat,$mods)=regexp_pattern(qr/foo/i); if (is_regexp($obj)) { print “Got regexp: “, scalar regexp_pattern($obj); # just as perl would stringify } # it but no hassle with blessed # re’s.

sigtrap

The sigtrap pragma enables simple signal handling.

use sigtrap; use sigtrap qw(stack-trace old-interface-signals); # equivalent use sigtrap qw(BUS SEGV PIPE ABRT); use sigtrap qw(die INT QUIT); use sigtrap qw(die normal-signals); use sigtrap qw(die untrapped normal-signals); use sigtrap qw(die untrapped normal-signals stack-trace any error-signals); use sigtrap ‘handler’ => &my_handler, ’normal-signals’; use sigtrap qw(handler my_handler normal-signals stack-trace error-signals);

sort

The sort pragma controls the behavior of sort().

use sort ‘stable’; # guarantee stability use sort ‘_quicksort’; # use a quicksort algorithm use sort ‘_mergesort’; # use a mergesort algorithm use sort ‘defaults’; # revert to default behavior no sort ‘stable’; # stability not important use sort ‘_qsort’; # alias for quicksort my $current; BEGIN { $current = sort::current(); # identify prevailing algorithm }

strict

The strict pragma restricts unsafe constructs.

use strict; use strict “vars”; use strict “refs”; use strict “subs”; use strict; no strict “vars”;

subs

The subs pragma pre-declares subroutine names.

use subs qw(frob); frob 3..10;

threads

The threads pragma controls perl interpreter-based threads.

use threads (‘yield’, ‘stack_size’ => 64*4096, ’exit’ => ’threads_only’, ‘stringify’); sub start_thread { my @args = @_; print(‘Thread started: ‘, join(’ ‘, @args), “\n”); } my $thr = threads->create(‘start_thread’, ‘argument’); $thr->join(); threads->create(sub { print(“I am a thread\n”); })->join(); my $thr2 = async { foreach (@files) { … } }; $thr2->join(); if (my $err = $thr2->error()) { warn(“Thread error: $err\n”); }

Invoke thread in list context (implicit) so it can return a list

my ($thr) = threads->create(sub { return (qw/a b c/); });

or specify list context explicitly

my $thr = threads->create({‘context’ => ’list’}, sub { return (qw/a b c/); }); my @results = $thr->join(); $thr->detach();

Get a thread’s object

$thr = threads->self(); $thr = threads->object($tid);

Get a thread’s ID

$tid = threads->tid(); $tid = $thr->tid(); $tid = “$thr”;

Give other threads a chance to run

threads->yield(); yield();

Lists of non-detached threads

my @threads = threads->list(); my $thread_count = threads->list(); my @running = threads->list(threads::running); my @joinable = threads->list(threads::joinable);

Test thread objects

if ($thr1 == $thr2) { … }

Manage thread stack size

$stack_size = threads->get_stack_size(); $old_size = threads->set_stack_size(32*4096);

Create a thread with a specific context and stack size

my $thr = threads->create({ ‘context’ => ’list’, ‘stack_size’ => 32*4096, ’exit’ => ’thread_only’ }, &foo);

Get thread’s context

my $wantarray = $thr->wantarray();

Check thread’s state

if ($thr->is_running()) { sleep(1); } if ($thr->is_joinable()) { $thr->join(); }

Send a signal to a thread

$thr->kill(‘SIGUSR1’);

Exit a thread

threads->exit();

threads::shared

threads::shared perl extension for sharing data structures between threads.

use threads; use threads::shared; my $var :shared; my %hsh :shared; my @ary :shared; my ($scalar, @array, %hash); share($scalar); share(@array); share(%hash); $var = $scalar_value; $var = $shared_ref_value; $var = shared_clone($non_shared_ref_value); $var = shared_clone({‘foo’ => [qw/foo bar baz/]}); $hsh{‘foo’} = $scalar_value; $hsh{‘bar’} = $shared_ref_value; $hsh{‘baz’} = shared_clone($non_shared_ref_value); $hsh{‘quz’} = shared_clone([1..3]); $ary[0] = $scalar_value; $ary[1] = $shared_ref_value; $ary[2] = shared_clone($non_shared_ref_value); $ary[3] = shared_clone([ {}, [] ]); { lock(%hash); … } cond_wait($scalar); cond_timedwait($scalar, time() + 30); cond_broadcast(@array); cond_signal(%hash); my $lockvar :shared;

condition var != lock var

cond_wait($var, $lockvar); cond_timedwait($var, time()+30, $lockvar);

utf8

The utf8 pragma enables/disables UTF-8 (or UTF-EBCDIC) in source code.

use utf8; no utf8;

Convert the internal representation of a Perl scalar to/from UTF-8.

$num_octets = utf8::upgrade($string); $success = utf8::downgrade($string[, FAIL_OK]);

Change each character of a Perl scalar to/from a series of

characters that represent the UTF-8 bytes of each original character.

utf8::encode($string); # “\x{100}” becomes “\xc4\x80” utf8::decode($string); # “\xc4\x80” becomes “\x{100}” $flag = utf8::is_utf8(STRING); # since Perl 5.8.1 $flag = utf8::valid(STRING);

vars

The vars pragma pre-declares global variable names.

use vars qw($frob @mung %seen);

vmsish

The vmsish pragma controls VMS-specific language features.

use vmsish; use vmsish ‘status’; # or ‘$?’ use vmsish ’exit’; use vmsish ’time’; use vmsish ‘hushed’; no vmsish ‘hushed’; vmsish::hushed($hush); use vmsish; no vmsish ’time’;

warnings

The warnings pragma controls optional warnings.

use warnings; no warnings; use warnings “all”; no warnings “all”; use warnings::register; if (warnings::enabled()) { warnings::warn(“some warning”); } if (warnings::enabled(“void”)) { warnings::warn(“void”, “some warning”); } if (warnings::enabled($object)) { warnings::warn($object, “some warning”); } warnings::warnif(“some warning”); warnings::warnif(“void””, “some warning”); warnings::warnif($object, “some warning”);

warnings:register

The warnings::register is the warnings import function.

use warnings::register;

  • Linux perl command overview
  • Syntax
  • Perl Data Types
  • Perl Subroutines
  • Perl Operators
  • Perl Functions