Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
PERLOP(1)	       Perl Programmers	Reference Guide		     PERLOP(1)

NAME
       perlop -	Perl expressions: operators, precedence, string	literals

DESCRIPTION
       In Perl,	the operator determines	what operation is performed,
       independent of the type of the operands.	 For example "$x + $y" is
       always a	numeric	addition, and if $x or $y do not contain numbers, an
       attempt is made to convert them to numbers first.

       This is in contrast to many other dynamic languages, where the
       operation is determined by the type of the first	argument.  It also
       means that Perl has two versions	of some	operators, one for numeric and
       one for string comparison.  For example "$x == $y" compares two numbers
       for equality, and "$x eq	$y" compares two strings.

       There are a few exceptions though: The operator "x" can be either
       string repetition or list repetition, depending on the type of the left
       operand,	and "&", "|", "^" and "~" can be either	string or numeric bit
       operations.

   Operator Precedence and Associativity
       Operator	precedence and associativity work in Perl more or less like
       they do in mathematics.

       Operator	precedence means some operators	group more tightly than
       others.	For example, in	"2 + 4 * 5", the multiplication	has higher
       precedence, so "4 * 5" is grouped together as the right-hand operand of
       the addition, rather than "2 + 4" being grouped together	as the
       left-hand operand of the	multiplication.	It is as if the	expression
       were written "2 + (4 * 5)", not "(2 + 4)	* 5". So the expression	yields
       "2 + 20 == 22", rather than "6 *	5 == 30".

       Operator	associativity defines what happens if a	sequence of the	same
       operators is used one after another: usually that they will be grouped
       at the left or the right. For example, in "9 - 3	- 2", subtraction is
       left associative, so "9 - 3" is grouped together	as the left-hand
       operand of the second subtraction, rather than "3 - 2" being grouped
       together	as the right-hand operand of the first subtraction. It is as
       if the expression were written "(9 - 3) - 2", not "9 - (3 - 2)".	So the
       expression yields "6 - 2	== 4", rather than "9 -	1 == 8".

       For simple operators that evaluate all their operands and then combine
       the values in some way, precedence and associativity (and parentheses)
       imply some ordering requirements	on those combining operations. For
       example,	in 2 + 4 * 5, the grouping implied by precedence means that
       the multiplication of 4 and 5 must be performed before the addition of
       2 and 20, simply	because	the result of that multiplication is required
       as one of the operands of the addition. But the order of	operations is
       not fully determined by this: in	"2 * 2 + 4 * 5"	both multiplications
       must be performed before	the addition, but the grouping does not	say
       anything	about the order	in which the two multiplications are
       performed. In fact Perl has a general rule that the operands of an
       operator	are evaluated in left-to-right order. A	few operators such as
       "&&=" have special evaluation rules that	can result in an operand not
       being evaluated at all; in general, the top-level operator in an
       expression has control of operand evaluation.

       Some comparison operators, as their associativity, chain	with some
       operators of the	same precedence	(but never with	operators of different
       precedence).  This chaining means that each comparison is performed on
       the two arguments surrounding it, with each interior argument taking
       part in two comparisons,	and the	comparison results are implicitly
       ANDed.  Thus "$x	< $y <=	$z" behaves exactly like
       "$x < $y	&& $y <= $z", assuming that "$y" is as simple a	scalar as it
       looks.  The ANDing short-circuits just like "&&"	does, stopping the
       sequence	of comparisons as soon as one yields false.

       In a chained comparison,	each argument expression is evaluated at most
       once, even if it	takes part in two comparisons, but the result of the
       evaluation is fetched for each comparison.  (It is not evaluated	at all
       if the short-circuiting means that it's not required for	any
       comparisons.)  This matters if the computation of an interior argument
       is expensive or non-deterministic.  For example,

	   if ($x < expensive_sub() <= $z) { ...

       is not entirely like

	   if ($x < expensive_sub() && expensive_sub() <= $z) {	...

       but instead closer to

	   my $tmp = expensive_sub();
	   if ($x < $tmp && $tmp <= $z)	{ ...

       in that the subroutine is only called once.  However, it's not exactly
       like this latter	code either, because the chained comparison doesn't
       actually	involve	any temporary variable (named or otherwise): there is
       no assignment.  This doesn't make much difference where the expression
       is a call to an ordinary	subroutine, but	matters	more with an lvalue
       subroutine, or if the argument expression yields	some unusual kind of
       scalar by other means.  For example, if the argument expression yields
       a tied scalar, then the expression is evaluated to produce that scalar
       at most once, but the value of that scalar may be fetched up to twice,
       once for	each comparison	in which it is actually	used.

       In this example,	the expression is evaluated only once, and the tied
       scalar (the result of the expression) is	fetched	for each comparison
       that uses it.

	   if ($x < $tied_scalar < $z) { ...

       In the next example, the	expression is evaluated	only once, and the
       tied scalar is fetched once as part of the operation within the
       expression.  The	result of that operation is fetched for	each
       comparison, which normally doesn't matter unless	that expression	result
       is also magical due to operator overloading.

	   if ($x < $tied_scalar + 42 <	$z) { ...

       Some operators are instead non-associative, meaning that	it is a	syntax
       error to	use a sequence of those	operators of the same precedence.  For
       example,	"$x .. $y .. $z" is an error.

       Perl operators have the following associativity and precedence, listed
       from highest precedence to lowest.  Operators borrowed from C keep the
       same precedence relationship with each other, even where	C's precedence
       is slightly screwy.  (This makes	learning Perl easier for C folks.)
       With very few exceptions, these all operate on scalar values only, not
       array values.

	   left	       terms and list operators	(leftward)
	   left	       ->
	   nonassoc    ++ --
	   right       **
	   right       ! ~ ~. \	and unary + and	-
	   left	       =~ !~
	   left	       * / % x
	   left	       + - .
	   left	       << >>
	   nonassoc    named unary operators
	   nonassoc    isa
	   chained     < > <= >= lt gt le ge
	   chain/na    == != eq	ne <=> cmp ~~
	   left	       & &.
	   left	       | |. ^ ^.
	   left	       &&
	   left	       || ^^ //
	   nonassoc    ..  ...
	   right       ?:
	   right       = += -= *= etc. goto last next redo dump
	   left	       , =>
	   nonassoc    list operators (rightward)
	   right       not
	   left	       and
	   left	       or xor

       The following sections cover these operators in detail.	Each section
       covers all the operators	for a single precedence	level.	The sections
       are ordered highest precedence first, same as in	the table above.

       Many operators can be overloaded	for objects.  See overload.

   Terms and List Operators (Leftward)
       A TERM has the highest precedence in Perl.  They	include	variables,
       quote and quote-like operators, any expression in parentheses, and any
       function	whose arguments	are parenthesized.  Actually, there aren't
       really functions	in this	sense, just list operators and unary operators
       behaving	as functions because you put parentheses around	the arguments.
       These are all documented	in perlfunc.

       If any list operator (print(), etc.) or any unary operator (chdir(),
       etc.)  is followed by a left parenthesis	as the next token, the
       operator	and arguments within parentheses are taken to be of highest
       precedence, just	like a normal function call.

       In the absence of parentheses, the precedence of	list operators such as
       "print",	"sort",	or "chmod" is either very high or very low depending
       on whether you are looking at the left side or the right	side of	the
       operator.  For example, in

	   @ary	= (1, 3, sort 4, 2);
	   print @ary;	       # prints	1324

       the commas on the right of the "sort" are evaluated before the "sort",
       but the commas on the left are evaluated	after.	In other words,	list
       operators tend to gobble	up all arguments that follow, and then act
       like a simple TERM with regard to the preceding expression.  Be careful
       with parentheses:

	   # These evaluate exit before	doing the print:
	   print($foo, exit);  # Obviously not what you	want.
	   print $foo, exit;   # Nor is	this.

	   # These do the print	before evaluating exit:
	   (print $foo), exit; # This is what you want.
	   print($foo),	exit;  # Or this.
	   print ($foo), exit; # Or even this.

       Also note that

	   print ($foo & 255) +	1, "\n";

       probably	doesn't	do what	you expect at first glance.  The parentheses
       enclose the argument list for "print" which is evaluated	(printing the
       result of "$foo & 255").	 Then one is added to the return value of
       "print" (usually	1).  The result	is something like this:

	   1 + 1, "\n";	   # Obviously not what	you meant.

       To do what you meant properly, you must write:

	   print(($foo & 255) +	1, "\n");

       See "Named Unary	Operators" for more discussion of this.

       Also parsed as terms are	the "do	{}" and	"eval {}" constructs, as well
       as subroutine and method	calls, and the anonymous constructors "[]" and
       "{}".

       See also	"Quote and Quote-like Operators" below,	as well	as "I/O
       Operators".

   The Arrow Operator
       ""->"" is an infix dereference operator,	just as	it is in C and C++.
       If the right side is one	of a "[...]", "{...}", or a "(...)" subscript,
       then the	left side must be either a hard	or symbolic reference to an
       array, a	hash, or a subroutine respectively.  (Or technically speaking,
       a location capable of holding a hard reference, if it's an array	or
       hash reference being used for assignment.)  See perlreftut and perlref.

       Otherwise, the right side is a method name or a simple scalar variable
       containing either the method name or a subroutine reference, and	(if it
       is a method name) the left side must be either an object	(a blessed
       reference) or a class name (that	is, a package name).  See perlobj.

       The right side may also be the name of a	subroutine, prefixed with the
       "&" sigil.  This	creates	what looks like	a lexical method invocation,
       where the method	subroutine is resolved lexically instead of by name by
       a search	within the packages of the object's class.  This resolution
       happens entirely	at compile-time, and performs the same as a regular
       subroutine call at runtime.

       The dereferencing cases (as opposed to method-calling cases) are
       somewhat	extended by the	"postderef" feature.  For the details of that
       feature,	consult	"Postfix Dereference Syntax" in	perlref.

   Auto-increment and Auto-decrement
       "++" and	"--" work as in	C.  That is, if	placed before a	variable, they
       increment or decrement the variable by one before returning the value,
       and if placed after, increment or decrement after returning the value.

	   $i =	0;  $j = 0;
	   print $i++;	# prints 0
	   print ++$j;	# prints 1

       Note that just as in C, Perl doesn't define when	the variable is
       incremented or decremented.  You	just know it will be done sometime
       before or after the value is returned.  This also means that modifying
       a variable twice	in the same statement will lead	to undefined behavior.
       Avoid statements	like:

	   $i =	$i ++;
	   print ++ $i + $i ++;

       Perl will not guarantee what the	result of the above statements is.

       The auto-increment operator has a little	extra builtin magic to it.  If
       you increment a variable	that is	numeric, or that has ever been used in
       a numeric context, you get a normal increment.  If, however, the
       variable	has been used in only string contexts since it was set,	and
       has a value that	is not the empty string	and matches the	pattern
       "/^[a-zA-Z]*[0-9]*\z/", the increment is	done as	a string, preserving
       each character within its range,	with carry:

	   print ++($foo = "99");      # prints	"100"
	   print ++($foo = "a0");      # prints	"a1"
	   print ++($foo = "Az");      # prints	"Ba"
	   print ++($foo = "zz");      # prints	"aaa"

       "undef" is always treated as numeric, and in particular is changed to 0
       before incrementing (so that a post-increment of	an undef value will
       return 0	rather than "undef").

       The auto-decrement operator is not magical.

   Exponentiation
       Binary "**" is the exponentiation operator.  It binds even more tightly
       than unary minus, so "-2**4" is "-(2**4)", not "(-2)**4".  (This	is
       implemented using C's pow(3) function, which actually works on doubles
       internally.)

       Note that certain exponentiation	expressions are	ill-defined: these
       include "0**0", "1**Inf", and "Inf**0".	Do not expect any particular
       results from these special cases, the results are platform-dependent.

   Symbolic Unary Operators
       Unary "!" performs logical negation, that is, "not".  See also "not"
       for a lower precedence version of this.

       Unary "-" performs arithmetic negation if the operand is	numeric,
       including any string that looks like a number.  If the operand is an
       identifier, a string consisting of a minus sign concatenated with the
       identifier is returned.	Otherwise, if the string starts	with a plus or
       minus, a	string starting	with the opposite sign is returned.  One
       effect of these rules is	that "-bareword" is equivalent to the string
       "-bareword".  If, however, the string begins with a non-alphabetic
       character (excluding "+"	or "-"), Perl will attempt to convert the
       string to a numeric, and	the arithmetic negation	is performed.  If the
       string cannot be	cleanly	converted to a numeric,	Perl will give the
       warning Argument	"the string" isn't numeric in negation (-) at ....

       Unary "~" performs bitwise negation, that is, 1's complement.  For
       example,	"0666 &	~027" is 0640.	(See also "Integer Arithmetic" and
       "Bitwise	String Operators".)  Note that the width of the	result is
       platform-dependent: "~0"	is 32 bits wide	on a 32-bit platform, but 64
       bits wide on a 64-bit platform, so if you are expecting a certain bit
       width, remember to use the "&" operator to mask off the excess bits.

       Starting	in Perl	5.28, it is a fatal error to try to complement a
       string containing a character with an ordinal value above 255.

       If the "bitwise"	feature	is enabled via "use feature 'bitwise'" or "use
       v5.28", then unary "~" always treats its	argument as a number, and an
       alternate form of the operator, "~.", always treats its argument	as a
       string.	So "~0"	and "~"0"" will	both give 2**32-1 on 32-bit platforms,
       whereas "~.0" and "~."0"" will both yield "\xff".  Until	Perl 5.28,
       this feature produced a warning in the "experimental::bitwise"
       category.

       Unary "+" has no	effect whatsoever, even	on strings.  It	is useful
       syntactically for separating a function name from a parenthesized
       expression that would otherwise be interpreted as the complete list of
       function	arguments.  (See examples above	under "Terms and List
       Operators (Leftward)".)

       Unary "\" creates references.  If its operand is	a single sigilled
       thing, it creates a reference to	that object.  If its operand is	a
       parenthesised list, then	it creates references to the things mentioned
       in the list.  Otherwise it puts its operand in list context, and
       creates a list of references to the scalars in the list provided	by the
       operand.	 See perlreftut	and perlref.  Do not confuse this behavior
       with the	behavior of backslash within a string, although	both forms do
       convey the notion of protecting the next	thing from interpolation.

   Binding Operators
       Binary "=~" binds a scalar expression to	a pattern match.  Certain
       operations search or modify the string $_ by default.  This operator
       makes that kind of operation work on some other string.	The right
       argument	is a search pattern, substitution, or transliteration.	The
       left argument is	what is	supposed to be searched, substituted, or
       transliterated instead of the default $_.  When used in scalar context,
       the return value	generally indicates the	success	of the operation.  The
       exceptions are substitution ("s///") and	transliteration	("y///") with
       the "/r"	(non-destructive) option, which	cause the return value to be
       the result of the substitution.	Behavior in list context depends on
       the particular operator.	 See "Regexp Quote-Like	Operators" for details
       and perlretut for examples using	these operators.

       If the right argument is	an expression rather than a search pattern,
       substitution, or	transliteration, it is interpreted as a	search pattern
       at run time.  Note that this means that its contents will be
       interpolated twice, so

	   '\\'	=~ q'\\';

       is not ok, as the regex engine will end up trying to compile the
       pattern "\", which it will consider a syntax error.

       Binary "!~" is just like	"=~" except the	return value is	negated	in the
       logical sense.

       Binary "!~" with	a non-destructive substitution ("s///r") or
       transliteration ("y///r") is a syntax error.

   Multiplicative Operators
       Binary "*" multiplies two numbers.

       Binary "/" divides two numbers.

       Binary "%" is the modulo	operator, which	computes the division
       remainder of its	first argument with respect to its second argument.
       Given integer operands $m and $n: If $n is positive, then "$m % $n" is
       $m minus	the largest multiple of	$n less	than or	equal to $m.  If $n is
       negative, then "$m % $n"	is $m minus the	smallest multiple of $n	that
       is not less than	$m (that is, the result	will be	less than or equal to
       zero).  If the operands $m and $n are floating point values and the
       absolute	value of $n (that is abs($n)) is less than "(UV_MAX + 1)",
       only the	integer	portion	of $m and $n will be used in the operation
       (Note: here "UV_MAX" means the maximum of the unsigned integer type).
       If the absolute value of	the right operand (abs($n)) is greater than or
       equal to	"(UV_MAX + 1)",	"%" computes the floating-point	remainder $r
       in the equation "($r = $m - $i*$n)" where $i is a certain integer that
       makes $r	have the same sign as the right	operand	$n (not	as the left
       operand $m like C function fmod()) and the absolute value less than
       that of $n.  Note that when "use	integer" is in scope, "%" gives	you
       direct access to	the modulo operator as implemented by your C compiler.
       This operator is	not as well defined for	negative operands, but it will
       execute faster.

       Binary "x" is the repetition operator.  In scalar context, or if	the
       left operand is neither enclosed	in parentheses nor a "qw//" list, it
       performs	a string repetition.  In that case it supplies scalar context
       to the left operand, and	returns	a string consisting of the left
       operand string repeated the number of times specified by	the right
       operand.	 If the	"x" is in list context,	and the	left operand is	either
       enclosed	in parentheses or a "qw//" list, it performs a list
       repetition.  In that case it supplies list context to the left operand,
       and returns a list consisting of	the left operand list repeated the
       number of times specified by the	right operand.	If the right operand
       is zero or negative (raising a warning on negative), it returns an
       empty string or an empty	list, depending	on the context.

	   print '-' x 80;	       # print row of dashes

	   print "\t" x	($tab/8), ' ' x	($tab%8);      # tab over

	   @ones = (1) x 80;	       # a list	of 80 1's
	   @ones = (5) x @ones;	       # set all elements to 5

   Additive Operators
       Binary "+" returns the sum of two numbers.

       Binary "-" returns the difference of two	numbers.

       Binary "." concatenates two strings.

   Shift Operators
       Binary "<<" returns the value of	its left argument shifted left by the
       number of bits specified	by the right argument.	Arguments should be
       integers.  (See also "Integer Arithmetic".)

       Binary ">>" returns the value of	its left argument shifted right	by the
       number of bits specified	by the right argument.	Arguments should be
       integers.  (See also "Integer Arithmetic".)

       If "use integer"	(see "Integer Arithmetic") is in force then signed C
       integers	are used (arithmetic shift), otherwise unsigned	C integers are
       used (logical shift), even for negative shiftees.  In arithmetic	right
       shift the sign bit is replicated	on the left, in	logical	shift zero
       bits come in from the left.

       Either way, the implementation isn't going to generate results larger
       than the	size of	the integer type Perl was built	with (32 bits or 64
       bits).

       Shifting	by a negative number of	bits means the reverse shift: left
       shift becomes right shift, right	shift becomes left shift.  This	is
       unlike in C, where negative shift is undefined.

       Shifting	by a value greater than	or equal to integer size (in bits)
       results in zero (all bits fall off), except that	under "use integer"
       right shifting a	negative value by such an amount results in -1.	 This
       is unlike in C, where shifting by too many bits is undefined.

       If you get tired	of being subject to your platform's native integers,
       the "use	bigint"	pragma neatly sidesteps	the issue altogether:

	   print 20 << 20;  # 20971520
	   print 20 << 32;  # 0	with 32-bit integer,
			    # 85899345920 with 64-bit integer
	   use bigint;
	   print 20 << 100; # 25353012004564588029934064107520

   Named Unary Operators
       The various named unary operators are treated as	functions with one
       argument, with optional parentheses.

       If any list operator (print(), etc.) or any unary operator (chdir(),
       etc.)  is followed by a left parenthesis	as the next token, the
       operator	and arguments within parentheses are taken to be of highest
       precedence, just	like a normal function call.  For example, because
       named unary operators are higher	precedence than	"||":

	   chdir $foo	 || die;       # (chdir	$foo) || die
	   chdir($foo)	 || die;       # (chdir	$foo) || die
	   chdir ($foo)	 || die;       # (chdir	$foo) || die
	   chdir +($foo) || die;       # (chdir	$foo) || die

       but, because "*"	is higher precedence than named	operators:

	   chdir $foo *	20;    # chdir ($foo * 20)
	   chdir($foo) * 20;   # (chdir	$foo) *	20
	   chdir ($foo)	* 20;  # (chdir	$foo) *	20
	   chdir +($foo) * 20; # chdir ($foo * 20)

	   rand	10 * 20;       # rand (10 * 20)
	   rand(10) * 20;      # (rand 10) * 20
	   rand	(10) * 20;     # (rand 10) * 20
	   rand	+(10) *	20;    # rand (10 * 20)

       Regarding precedence, the filetest operators, like "-f",	"-M", etc. are
       treated like named unary	operators, but they don't follow this
       functional parenthesis rule.  That means, for example, that
       "-f($file).".bak"" is equivalent	to "-f "$file.bak"".

       See also	"Terms and List	Operators (Leftward)".

   Class Instance Operator
       Binary "isa" evaluates to true when the left argument is	an object
       instance	of the class (or a subclass derived from that class) given by
       the right argument.  If the left	argument is not	defined, not a blessed
       object instance,	and does not derive from the class given by the	right
       argument, the operator evaluates	as false. The right argument may give
       the class either	as a bareword or a scalar expression that yields a
       string class name:

	   if (	$obj isa Some::Class ) { ... }

	   if (	$obj isa "Different::Class" ) {	... }
	   if (	$obj isa $name_of_class	) { ...	}

       This feature is available from Perl 5.31.6 onwards when enabled by "use
       feature 'isa'". This feature is enabled automatically by	a "use v5.36"
       (or higher) declaration in the current scope.

   Relational Operators
       Perl operators that return true or false	generally return values	that
       can be safely used as numbers.  For example, the	relational operators
       in this section and the equality	operators in the next one return 1 for
       true and	a special version of the defined empty string, "", which
       counts as a zero	but is exempt from warnings about improper numeric
       conversions, just as "0 but true" is.

       Binary "<" returns true if the left argument is numerically less	than
       the right argument.

       Binary ">" returns true if the left argument is numerically greater
       than the	right argument.

       Binary "<=" returns true	if the left argument is	numerically less than
       or equal	to the right argument.

       Binary ">=" returns true	if the left argument is	numerically greater
       than or equal to	the right argument.

       Binary "lt" returns true	if the left argument is	stringwise less	than
       the right argument.

       Binary "gt" returns true	if the left argument is	stringwise greater
       than the	right argument.

       Binary "le" returns true	if the left argument is	stringwise less	than
       or equal	to the right argument.

       Binary "ge" returns true	if the left argument is	stringwise greater
       than or equal to	the right argument.

       A sequence of relational	operators, such	as "$x < $y <= $z", performs
       chained comparisons, in the manner described above in the section
       "Operator Precedence and	Associativity".	 Beware	that they do not chain
       with equality operators,	which have lower precedence.

       "lt", "le", "ge", "gt", and "cmp" (this last is described in the	next
       section)	use the	collation (sort) order specified by the	current
       "LC_COLLATE" locale if a	"use locale" form that includes	collation is
       in effect.  See perllocale.  Depending on the capabilities of the
       platform, these can give	reasonable results with	Unicode, but the
       standard	"Unicode::Collate" and "Unicode::Collate::Locale" modules
       offer much more powerful	solutions to collation issues.

       For case-insensitive comparisons, look at the "fc" in perlfunc
       case-folding function, available	in Perl	v5.16 or later:

	   if (	fc($x) eq fc($y) ) { ... }

   Equality Operators
       Binary "==" returns true	if the left argument is	numerically equal to
       the right argument.

       Binary "!=" returns true	if the left argument is	numerically not	equal
       to the right argument.

       Binary "eq" returns true	if the left argument is	stringwise equal to
       the right argument.

       Binary "ne" returns true	if the left argument is	stringwise not equal
       to the right argument.

       A sequence of the above equality	operators, such	as "$x == $y ==	$z",
       performs	chained	comparisons, in	the manner described above in the
       section "Operator Precedence and	Associativity".	 Beware	that they do
       not chain with relational operators, which have higher precedence.

       Binary "<=>" returns -1,	0, or 1	depending on whether the left argument
       is numerically less than, equal to, or greater than the right argument.
       If your platform	supports "NaN"'s (not-a-numbers) as numeric values,
       using them with "<=>" returns undef.  "NaN" is not "<", "==", ">", "<="
       or ">=" anything	(even "NaN"), so those 5 return	false.	"NaN !=	NaN"
       returns true, as	does "NaN !=" anything else.  If your platform doesn't
       support "NaN"'s then "NaN" is just a string with	numeric	value 0.

	   $ perl -le '$x = "NaN"; print "No NaN support here" if $x ==	$x'
	   $ perl -le '$x = "NaN"; print "NaN support here" if $x != $x'

       (Note that the bigint, bigrat, and bignum pragmas all support "NaN".)

       Binary "cmp" returns -1,	0, or 1	depending on whether the left argument
       is stringwise less than,	equal to, or greater than the right argument.

       Here we can see the difference between "<=>" and	"cmp",

	   print 10 <=>	2 #prints 1
	   print 10 cmp	2 #prints -1

       (likewise between the relational	operators that were described in the
       previous	section: "gt" and ">", "lt" and	"<", etc.)

       Binary "~~" does	a smartmatch between its arguments.  Smart matching is
       complicated enough to warrant two subsections, starting just below.

       The two-sided ordering operators	"<=>" and "cmp", and the smartmatch
       operator	"~~", are non-associative with respect to each other and with
       respect to the equality operators of the	same precedence.

       Smartmatch Operator

       The "smartmatch"	feature	is discouraged for new code and	retained for
       backward	compatibility.

       The smartmatch operator was introduced in 5.10.0	had significant
       changes in 5.10.1.  It is enabled by default and	in all feature bundles
       up to 5.40.  To use smartmatch with a later feature bundle you will
       need enable it explicitly:

	 use v5.42;
	 use feature "smartmatch";

       Binary "~~" does	a "smartmatch" between its arguments.  This is mostly
       used implicitly in the "when" construct described in perlsyn, although
       not all "when" clauses call the smartmatch operator.  Unique among all
       of Perl's operators, the	smartmatch operator can	recurse.

       It is also unique in that all other Perl	operators impose a context
       (usually	string or numeric context) on their operands, autoconverting
       those operands to those imposed contexts.  In contrast, smartmatch
       infers contexts from the	actual types of	its operands and uses that
       type information	to select a suitable comparison	mechanism.

       The "~~"	operator compares its operands "polymorphically", determining
       how to compare them according to	their actual types (numeric, string,
       array, hash, etc.).  Like the equality operators	with which it shares
       the same	precedence, "~~" returns 1 for true and	"" for false.  It is
       often best read aloud as	"in", "inside of", or "is contained in",
       because the left	operand	is often looked	for inside the right operand.
       That makes the order of the operands to the smartmatch operand often
       opposite	that of	the regular match operator.  In	other words, the
       "smaller" thing is usually placed in the	left operand and the larger
       one in the right.

       The behavior of a smartmatch depends on what type of things its
       arguments are, as determined by the following table.  The first row of
       the table whose types apply determines the smartmatch behavior.
       Because what actually happens is	mostly determined by the type of the
       second operand, the table is sorted on the right	operand	instead	of on
       the left.

	Left	  Right	     Description and pseudocode
	===============================================================
	Any	  undef	     check whether Any is undefined
		       like: !defined Any

	Any	  Object     invoke ~~ overloading on Object, or die

	Right operand is an ARRAY:

	Left	  Right	     Description and pseudocode
	===============================================================
	ARRAY1	  ARRAY2     recurse on	paired elements	of ARRAY1 and ARRAY2[2]
		       like: (ARRAY1[0]	~~ ARRAY2[0])
			       && (ARRAY1[1] ~~	ARRAY2[1]) && ...
	HASH	  ARRAY	     any ARRAY elements	exist as HASH keys
		       like: grep { exists HASH->{$_} }	ARRAY
	Regexp	  ARRAY	     any ARRAY elements	pattern	match Regexp
		       like: grep { /Regexp/ } ARRAY
	undef	  ARRAY	     undef in ARRAY
		       like: grep { !defined } ARRAY
	Any	  ARRAY	     smartmatch	each ARRAY element[3]
		       like: grep { Any	~~ $_ }	ARRAY

	Right operand is a HASH:

	Left	  Right	     Description and pseudocode
	===============================================================
	HASH1	  HASH2	     all same keys in both HASHes
		       like: keys HASH1	==
				grep { exists HASH2->{$_} } keys HASH1
	ARRAY	  HASH	     any ARRAY elements	exist as HASH keys
		       like: grep { exists HASH->{$_} }	ARRAY
	Regexp	  HASH	     any HASH keys pattern match Regexp
		       like: grep { /Regexp/ } keys HASH
	undef	  HASH	     always false (undef cannot	be a key)
		       like: 0 == 1
	Any	  HASH	     HASH key existence
		       like: exists HASH->{Any}

	Right operand is CODE:

	Left	  Right	     Description and pseudocode
	===============================================================
	ARRAY	  CODE	     sub returns true on all ARRAY elements[1]
		       like: !grep { !CODE->($_) } ARRAY
	HASH	  CODE	     sub returns true on all HASH keys[1]
		       like: !grep { !CODE->($_) } keys	HASH
	Any	  CODE	     sub passed	Any returns true
		       like: CODE->(Any)

	Right operand is a Regexp:

	Left	  Right	     Description and pseudocode
	===============================================================
	ARRAY	  Regexp     any ARRAY elements	match Regexp
		       like: grep { /Regexp/ } ARRAY
	HASH	  Regexp     any HASH keys match Regexp
		       like: grep { /Regexp/ } keys HASH
	Any	  Regexp     pattern match
		       like: Any =~ /Regexp/

	Other:

	Left	  Right	     Description and pseudocode
	===============================================================
	Object	  Any	     invoke ~~ overloading on Object,
			     or	fall back to...

	Any	  Num	     numeric equality
			like: Any == Num
	Num	  nummy[4]    numeric equality
			like: Num == nummy
	undef	  Any	     check whether undefined
			like: !defined(Any)
	Any	  Any	     string equality
			like: Any eq Any

       Notes:

       1. Empty	hashes or arrays match.
       2. That is, each	element	smartmatches the element of the	same index in
       the other array.[3]
       3. If a circular	reference is found, fall back to referential equality.
       4. Either an actual number, or a	string that looks like one.

       The smartmatch implicitly dereferences any non-blessed hash or array
       reference, so the "HASH"	and "ARRAY" entries apply in those cases.  For
       blessed references, the "Object"	entries	apply.	Smartmatches involving
       hashes only consider hash keys, never hash values.

       The "like" code entry is	not always an exact rendition.	For example,
       the smartmatch operator short-circuits whenever possible, but "grep"
       does not.  Also,	"grep" in scalar context returns the number of
       matches,	but "~~" returns only true or false.

       Unlike most operators, the smartmatch operator knows to treat "undef"
       specially:

	   use v5.10.1;
	   @array = (1,	2, 3, undef, 4,	5);
	   say "some elements undefined" if undef ~~ @array;

       Each operand is considered in a modified	scalar context,	the
       modification being that array and hash variables	are passed by
       reference to the	operator, which	implicitly dereferences	them.  Both
       elements	of each	pair are the same:

	   use v5.10.1;

	   my %hash = (red    => 1, blue   => 2, green	=> 3,
		       orange => 4, yellow => 5, purple	=> 6,
		       black  => 7, grey   => 8, white	=> 9);

	   my @array = qw(red blue green);

	   say "some array elements in hash keys" if  @array ~~	 %hash;
	   say "some array elements in hash keys" if \@array ~~	\%hash;

	   say "red in array" if "red" ~~  @array;
	   say "red in array" if "red" ~~ \@array;

	   say "some keys end in e" if /e$/ ~~	%hash;
	   say "some keys end in e" if /e$/ ~~ \%hash;

       Two arrays smartmatch if	each element in	the first array	smartmatches
       (that is, is "in") the corresponding element in the second array,
       recursively.

	   use v5.10.1;
	   my @little =	qw(red blue green);
	   my @bigger =	("red",	"blue",	[ "orange", "green" ] );
	   if (@little ~~ @bigger) {  #	true!
	       say "little is contained	in bigger";
	   }

       Because the smartmatch operator recurses	on nested arrays, this will
       still report that "red" is in the array.

	   use v5.10.1;
	   my @array = qw(red blue green);
	   my $nested_array = [[[[[[[ @array ]]]]]]];
	   say "red in array" if "red" ~~ $nested_array;

       If two arrays smartmatch	each other, then they are deep copies of each
       others' values, as this example reports:

	   use v5.12.0;
	   my @a = (0, 1, 2, [3, [4, 5], 6], 7);
	   my @b = (0, 1, 2, [3, [4, 5], 6], 7);

	   if (@a ~~ @b	&& @b ~~ @a) {
	       say "a and b are	deep copies of each other";
	   }
	   elsif (@a ~~	@b) {
	       say "a smartmatches in b";
	   }
	   elsif (@b ~~	@a) {
	       say "b smartmatches in a";
	   }
	   else	{
	       say "a and b don't smartmatch each other	at all";
	   }

       If you were to set "$b[3] = 4", then instead of reporting that "a and b
       are deep	copies of each other", it now reports that "b smartmatches in
       a".  That's because the corresponding position in @a contains an	array
       that (eventually) has a 4 in it.

       Smartmatching one hash against another reports whether both contain the
       same keys, no more and no less.	This could be used to see whether two
       records have the	same field names, without caring what values those
       fields might have.  For example:

	   use v5.10.1;
	   sub make_dogtag {
	       state $REQUIRED_FIELDS =	{ name=>1, rank=>1, serial_num=>1 };

	       my ($class, $init_fields) = @_;

	       die "Must supply	(only) name, rank, and serial number"
		   unless $init_fields ~~ $REQUIRED_FIELDS;

	       ...
	   }

       However,	this only does what you	mean if	$init_fields is	indeed a hash
       reference. The condition	"$init_fields ~~ $REQUIRED_FIELDS" also	allows
       the strings "name", "rank", "serial_num"	as well	as any array reference
       that contains "name" or "rank" or "serial_num" anywhere to pass
       through.

       The smartmatch operator is most often used as the implicit operator of
       a "when"	clause.	 See the section on "Switch Statements"	in perlsyn.

       Smartmatching of	Objects

       To avoid	relying	on an object's underlying representation, if the
       smartmatch's right operand is an	object that doesn't overload "~~", it
       raises the exception ""Smartmatching a non-overloaded object breaks
       encapsulation"".	 That's	because	one has	no business digging around to
       see whether something is	"in" an	object.	 These are all illegal on
       objects without a "~~" overload:

	   %hash ~~ $object
	      42 ~~ $object
	  "fred" ~~ $object

       However,	you can	change the way an object is smartmatched by
       overloading the "~~" operator.  This is allowed to extend the usual
       smartmatch semantics.  For objects that do have an "~~" overload, see
       overload.

       Using an	object as the left operand is allowed, although	not very
       useful.	Smartmatching rules take precedence over overloading, so even
       if the object in	the left operand has smartmatch	overloading, this will
       be ignored.  A left operand that	is a non-overloaded object falls back
       on a string or numeric comparison of whatever the "ref" operator
       returns.	 That means that

	   $object ~~ X

       does not	invoke the overload method with	"X" as an argument.  Instead
       the above table is consulted as normal, and based on the	type of	"X",
       overloading may or may not be invoked.  For simple strings or numbers,
       "in" becomes equivalent to this:

	   $object ~~ $number	       ref($object) == $number
	   $object ~~ $string	       ref($object) eq $string

       For example, this reports that the handle smells	IOish (but please
       don't really do this!):

	   use IO::Handle;
	   my $fh = IO::Handle->new();
	   if ($fh ~~ /\bIO\b/)	{
	       say "handle smells IOish";
	   }

       That's because it treats	$fh as a string	like
       "IO::Handle=GLOB(0x8039e0)", then pattern matches against that.

   Bitwise And
       Binary "&" returns its operands ANDed together bit by bit.  Although no
       warning is currently raised, the	result is not well defined when	this
       operation is performed on operands that aren't either numbers (see
       "Integer	Arithmetic") nor bitstrings (see "Bitwise String Operators").

       Note that "&" has lower priority	than relational	operators, so for
       example the parentheses are essential in	a test like

	   print "Even\n" if ($x & 1) == 0;

       If the "bitwise"	feature	is enabled via "use feature 'bitwise'" or "use
       v5.28", then this operator always treats	its operands as	numbers.
       Before Perl 5.28	this feature produced a	warning	in the
       "experimental::bitwise" category.

   Bitwise Or and Exclusive Or
       Binary "|" returns its operands ORed together bit by bit.  If both
       corresponding bits are 0, the resulting bit is 0; if either is 1, the
       result is 1.

       Binary "^" returns its operands XORed together bit by bit.  If both
       corresponding bits are 0	or both	are 1, the resulting bit is 0; if just
       one is 1, the result is 1.

       Although	no warning is currently	raised,	the results are	not well
       defined when these operations are performed on operands that aren't
       either numbers (see "Integer Arithmetic") nor bitstrings	(see "Bitwise
       String Operators").

       Note that "|" and "^" have lower	priority than relational operators, so
       for example the parentheses are essential in a test like

	   print "false\n" if (8 | 2) != 10;

       If the "bitwise"	feature	is enabled via "use feature 'bitwise'" or "use
       v5.28", then this operator always treats	its operands as	numbers.
       Before Perl 5.28. this feature produced a warning in the
       "experimental::bitwise" category.

   C-style Logical And
       Binary "&&" performs a short-circuit logical AND	operation.  That is,
       if the left operand is false, the right operand is not even evaluated.
       Scalar or list context propagates down to the right operand if it is
       evaluated.

       "&&" returns the	last value evaluated (unlike C's "&&", which returns 0
       or 1).

       As an alternative to "&&" when used for control flow, Perl provides the
       "and" operator (see below).  The	short-circuit behavior is identical.
       The precedence of "and" is much lower, however, so that you can safely
       use it after a list operator without the	need for parentheses.

   C-style Logical Or, Xor, and	Defined	Or
       Binary "||" performs a short-circuit logical OR operation.  That	is, if
       the left	operand	is true, the right operand is not even evaluated.
       Scalar or list context propagates down to the right operand if it does
       get evaluated.

       As an alternative to "||" when used for control flow, Perl provides the
       "or" operator (see below).  The short-circuit behavior is identical.
       The precedence of "or" is much lower, however, so that you can safely
       use it after a list operator without the	need for parentheses:

	   unlink "alpha", "beta", "gamma"
		   or gripe(), next LINE;

       With the	C-style	operator that would have been written like this:

	   unlink("alpha", "beta", "gamma")
		   || (gripe(),	next LINE);

       It would	be even	more readable to write that this way:

	   unless(unlink("alpha", "beta", "gamma")) {
	       gripe();
	       next LINE;
	   }

       Using "or" for assignment is unlikely to	do what	you want; see below.

       Binary "^^" performs a logical XOR operation.  Both operands are
       evaluated and the result	is true	only if	exactly	one of the operands is
       true.  Scalar or	list context propagates	down to	the right operand.

       Although	it has no direct equivalent in C, Perl's "//" operator is
       related to its C-style "or".  In	fact, it's exactly the same as "||",
       except that it tests the	left hand side's definedness instead of	its
       truth.  Thus, "EXPR1 // EXPR2" returns the value	of "EXPR1" if it's
       defined,	otherwise, the value of	"EXPR2"	is returned.  ("EXPR1" is
       evaluated in scalar context, "EXPR2" in the context of "//" itself).
       Usually,	this is	the same result	as "defined(EXPR1) ? EXPR1 : EXPR2"
       (except that the	ternary-operator form can be used as a lvalue, while
       "EXPR1 // EXPR2"	cannot).  This is very useful for providing default
       values for variables.  If you actually want to test if at least one of
       $x and $y is defined, use "defined($x //	$y)".

       The "||"	and "//" operators return the last value evaluated (unlike C's
       "||" which returns 0 or 1).  Thus, a reasonably portable	way to find
       out the home directory might be:

	   $home =  $ENV{HOME}
		 // $ENV{LOGDIR}
		 // (getpwuid($<))[7]
		 // die	"You're	homeless!\n";

       In particular, this means that you shouldn't use	this for selecting
       between two aggregates for assignment:

	   @a =	@b || @c;	     # This doesn't do the right thing
	   @a =	scalar(@b) || @c;    # because it really means this.
	   @a =	@b ? @b	: @c;	     # This works fine,	though.

   Range Operators
       Binary ".." is the range	operator, which	is really two different
       operators depending on the context.  In list context, it	returns	a list
       of values counting (up by ones) from the	left value to the right	value.
       If the left value is greater than the right value then it returns the
       empty list.  The	range operator is useful for writing "foreach (1..10)"
       loops and for doing slice operations on arrays.	No temporary array is
       created when the	range operator is used as the expression in "foreach"
       loops.

       The range operator also works on	strings, using the magical
       auto-increment, see below.

       In scalar context, ".." returns a boolean value.	 The operator is
       bistable, like a	flip-flop, and emulates	the line-range (comma)
       operator	of sed,	awk, and various editors.  Each	".." operator
       maintains its own boolean state,	even across calls to a subroutine that
       contains	it.  It	is false as long as its	left operand is	false.	Once
       the left	operand	is true, the range operator stays true until the right
       operand is true,	AFTER which the	range operator becomes false again.
       It doesn't become false till the	next time the range operator is
       evaluated.  It can test the right operand and become false on the same
       evaluation it became true (as in	awk), but it still returns true	once.
       If you don't want it to test the	right operand until the	next
       evaluation, as in sed, just use three dots ("...") instead of two.  In
       all other regards, "..."	behaves	just like ".." does.

       The right operand is not	evaluated while	the operator is	in the "false"
       state, and the left operand is not evaluated while the operator is in
       the "true" state.  The precedence is a little lower than	|| and &&.
       The value returned is either the	empty string for false,	or a sequence
       number (beginning with 1) for true.  The	sequence number	is reset for
       each range encountered.	The final sequence number in a range has the
       string "E0" appended to it, which doesn't affect	its numeric value, but
       gives you something to search for if you	want to	exclude	the endpoint.
       You can exclude the beginning point by waiting for the sequence number
       to be greater than 1.

       If either operand of scalar ".."	is a constant expression, that operand
       is considered true if it	is equal ("==")	to the current input line
       number (the $. variable).

       To be pedantic, the comparison is actually "int(EXPR) ==	int(EXPR)",
       but that	is only	an issue if you	use a floating point expression; when
       implicitly using	$. as described	in the previous	paragraph, the
       comparison is "int(EXPR)	== int($.)" which is only an issue when	$.  is
       set to a	floating point value and you are not reading from a file.
       Furthermore, "span" .. "spat" or	"2.18 .. 3.14" will not	do what	you
       want in scalar context because each of the operands are evaluated using
       their integer representation.

       Examples:

       As a scalar operator:

	   if (101 .. 200) { print; } #	print 2nd hundred lines, short for
				      #	 if ($.	== 101 .. $. ==	200) { print; }

	   next	LINE if	1 .. /^$/;    #	skip header lines, short for
				      #	  next LINE if $. == 1 .. /^$/;
				      #	(typically in a	loop labeled LINE)

	   s/^/> / if /^$/ .. eof();  #	quote body

	   # parse mail	messages
	   while (<>) {
	       $in_header =   1	 .. /^$/;
	       $in_body	  = /^$/ .. eof;
	       if ($in_header) {
		   # do	something
	       } else {	# in body
		   # do	something else
	       }
	   } continue {
	       close ARGV if eof;	      #	reset $. each file
	   }

       Here's a	simple example to illustrate the difference between the	two
       range operators:

	   @lines = ("	 - Foo",
		     "01 - Bar",
		     "1	 - Baz",
		     "	 - Quux");

	   foreach (@lines) {
	       if (/0/ .. /1/) {
		   print "$_\n";
	       }
	   }

       This program will print only the	line containing	"Bar".	If the range
       operator	is changed to "...", it	will also print	the "Baz" line.

       And now some examples as	a list operator:

	   for (101 .. 200) { print }	   # print $_ 100 times
	   @foo	= @foo[0 .. $#foo];	   # an	expensive no-op
	   @foo	= @foo[$#foo-4 .. $#foo];  # slice last	5 items

       Because each operand is evaluated in integer form, "2.18	.. 3.14" will
       return two elements in list context.

	   @list = (2.18 .. 3.14); # same as @list = (2	.. 3);

       The range operator in list context can make use of the magical
       auto-increment algorithm	if both	operands are strings, subject to the
       following rules:

          With	one exception (below), if both strings look like numbers to
	   Perl, the magic increment will not be applied, and the strings will
	   be treated as numbers (more specifically, integers) instead.

	   For example,	"-2".."2" is the same as -2..2,	and "2.18".."3.14"
	   produces "2,	3".

          The exception to the	above rule is when the left-hand string	begins
	   with	0 and is longer	than one character, in this case the magic
	   increment will be applied, even though strings like "01" would
	   normally look like a	number to Perl.

	   For example,	"01".."04" produces "01", "02",	"03", "04", and
	   "00".."-1" produces "00" through "99" - this	may seem surprising,
	   but see the following rules for why it works	this way.  To get
	   dates with leading zeros, you can say:

	       @z2 = ("01" .. "31");
	       print $z2[$mday];

	   If you want to force	strings	to be interpreted as numbers, you
	   could say

	       @numbers	= ( 0+$first ..	0+$last	);

	   Note: In Perl versions 5.30 and below, any string on	the left-hand
	   side	beginning with "0", including the string "0" itself, would
	   cause the magic string increment behavior. This means that on these
	   Perl	versions, "0".."-1" would produce "0" through "99", which was
	   inconsistent	with "0..-1", which produces the empty list. This also
	   means that "0".."9" now produces a list of integers instead of a
	   list	of strings.

          If the initial value	specified isn't	part of	a magical increment
	   sequence (that is, a	non-empty string matching
	   "/^[a-zA-Z]*[0-9]*\z/"), only the initial value will	be returned.

	   For example,	"ax".."az" produces "ax", "ay",	"az", but "*x".."az"
	   produces only "*x".

          For other initial values that are strings that do follow the	rules
	   of the magical increment, the corresponding sequence	will be
	   returned.

	   For example,	you can	say

	       @alphabet = ("A"	.. "Z");

	   to get all normal letters of	the English alphabet, or

	       $hexdigit = (0 .. 9, "a"	.. "f")[$num & 15];

	   to get a hexadecimal	digit.

          If the final	value specified	is not in the sequence that the
	   magical increment would produce, the	sequence goes until the	next
	   value would be longer than the final	value specified. If the	length
	   of the final	string is shorter than the first, the empty list is
	   returned.

	   For example,	"a".."--" is the same as "a".."zz", "0".."xx" produces
	   "0" through "99", and "aaa".."--" returns the empty list.

       As of Perl 5.26,	the list-context range operator	on strings works as
       expected	in the scope of	"use feature 'unicode_strings".	In previous
       versions, and outside the scope of that feature,	it exhibits "The
       "Unicode	Bug"" in perlunicode: its behavior depends on the internal
       encoding	of the range endpoint.

       Because the magical increment only works	on non-empty strings matching
       "/^[a-zA-Z]*[0-9]*\z/", the following will only return an alpha:

	   use charnames "greek";
	   my @greek_small =  ("\N{alpha}" .. "\N{omega}");

       To get the 25 traditional lowercase Greek letters, including both
       sigmas, you could use this instead:

	   use charnames "greek";
	   my @greek_small =  map { chr	} ( ord("\N{alpha}")
					       ..
					    ord("\N{omega}")
					  );

       However,	because	there are many other lowercase Greek characters	than
       just those, to match lowercase Greek characters in a regular
       expression, you could use the pattern "/(?:(?=\p{Greek})\p{Lower})+/"
       (or the experimental feature "/(?[ \p{Greek} & \p{Lower}	])+/").

   Conditional Operator
       Ternary "?:" is the conditional operator, just as in C.	It works much
       like an if-then-else.  If the argument before the "?" is	true, the
       argument	before the ":" is returned, otherwise the argument after the
       ":" is returned.	 For example:

	   printf "I have %d dog%s.\n",	$n,
		   ($n == 1) ? "" : "s";

       Scalar or list context propagates downward into the 2nd or 3rd
       argument, whichever is selected.

	   $x =	$ok ? $y : $z;	# get a	scalar
	   @x =	$ok ? @y : @z;	# get an array
	   $x =	$ok ? @y : @z;	# oops,	that's just a count!

       The operator may	be assigned to if both the 2nd and 3rd arguments are
       legal lvalues (meaning that you can assign to them):

	   ($x_or_y ? $x : $y) = $z;

       Because this operator produces an assignable result, using assignments
       without parentheses will	get you	in trouble.  For example, this:

	   $x %	2 ? $x += 10 : $x += 2

       Really means this:

	   (($x	% 2) ? ($x += 10) : $x)	+= 2

       Rather than this:

	   ($x % 2) ? ($x += 10) : ($x += 2)

       That should probably be written more simply as:

	   $x += ($x % 2) ? 10 : 2;

   Assignment Operators
       "=" is the ordinary assignment operator.

       Assignment operators work as in C.  That	is,

	   $x += 2;

       is equivalent to

	   $x =	$x + 2;

       although	without	duplicating any	side effects that dereferencing	the
       lvalue might trigger, such as from tie().  Other	assignment operators
       work similarly.	The following are recognized:

	   **=	  +=	*=    &=    &.=	   <<=	  &&=
		  -=	/=    |=    |.=	   >>=	  ||=
		  .=	%=    ^=    ^.=		  //=
			x=			  ^^=

       Although	these are grouped by family, they all have the precedence of
       assignment.  These combined assignment operators	can only operate on
       scalars,	whereas	the ordinary assignment	operator can assign to arrays,
       hashes, lists and even references.  (See	"Context" and "List value
       constructors" in	perldata, and "Assigning to References"	in perlref.)

       Unlike in C, the	scalar assignment operator produces a valid lvalue.
       Modifying an assignment is equivalent to	doing the assignment and then
       modifying the variable that was assigned	to.  This is useful for
       modifying a copy	of something, like this:

	   ($tmp = $global) =~ tr/13579/24680/;

       Although	as of 5.14, that can be	also be	accomplished this way:

	   use v5.14;
	   $tmp	= ($global =~  tr/13579/24680/r);

       Likewise,

	   ($x += 2) *=	3;

       is equivalent to

	   $x += 2;
	   $x *= 3;

       Similarly, a list assignment in list context produces the list of
       lvalues assigned	to, and	a list assignment in scalar context returns
       the number of elements produced by the expression on the	right hand
       side of the assignment.

       The three dotted	bitwise	assignment operators ("&.=" "|.=" "^.=") are
       new in Perl 5.22.  See "Bitwise String Operators".

   Comma Operator
       Binary "," is the comma operator.  In scalar context it evaluates its
       left argument, throws that value	away, then evaluates its right
       argument	and returns that value.	 This is just like C's comma operator.

       In list context,	it's just the list argument separator, and inserts
       both its	arguments into the list.  These	arguments are also evaluated
       from left to right.

       The "=>"	operator (sometimes pronounced "fat comma") is a synonym for
       the comma except	that it	causes a word on its left to be	interpreted as
       a string	if it begins with a letter or underscore and is	composed only
       of letters, digits and underscores.  This includes operands that	might
       otherwise be interpreted	as operators, constants, single	number
       v-strings or function calls.  If	in doubt about this behavior, the left
       operand can be quoted explicitly.

       Otherwise, the "=>" operator behaves exactly as the comma operator or
       list argument separator,	according to context.

       For example:

	   use constant	FOO => "something";

	   my %h = ( FOO => 23 );

       is equivalent to:

	   my %h = ("FOO", 23);

       It is NOT:

	   my %h = ("something", 23);

       The "=>"	operator is helpful in documenting the correspondence between
       keys and	values in hashes, and other paired elements in lists.

	   %hash = ( $key => $value );
	   login( $username => $password );

       The special quoting behavior ignores precedence,	and hence may apply to
       part of the left	operand:

	   print time.shift => "bbb";

       That example prints something like "1314363215shiftbbb",	because	the
       "=>" implicitly quotes the "shift" immediately on its left, ignoring
       the fact	that "time.shift" is the entire	left operand.

   List	Operators (Rightward)
       On the right side of a list operator, the comma has very	low
       precedence, such	that it	controls all comma-separated expressions found
       there.  The only	operators with lower precedence	are the	logical
       operators "and",	"or", and "not", which may be used to evaluate calls
       to list operators without the need for parentheses:

	   open	HANDLE,	"< :encoding(UTF-8)", "filename"
	       or die "Can't open: $!\n";

       However,	some people find that code harder to read than writing it with
       parentheses:

	   open(HANDLE,	"< :encoding(UTF-8)", "filename")
	       or die "Can't open: $!\n";

       in which	case you might as well just use	the more customary "||"
       operator:

	   open(HANDLE,	"< :encoding(UTF-8)", "filename")
	       || die "Can't open: $!\n";

       See also	discussion of list operators in	"Terms and List	Operators
       (Leftward)".

   Logical Not
       Unary "not" returns the logical negation	of the expression to its
       right.  It's the	equivalent of "!" except for the very low precedence.

   Logical And
       Binary "and" returns the	logical	conjunction of the two surrounding
       expressions.  It's equivalent to	"&&" except for	the very low
       precedence.  This means that it short-circuits: the right expression is
       evaluated only if the left expression is	true.

   Logical or and Exclusive Or
       There is	no low precedence operator for defined-OR.

       Binary "or" returns the logical inclusive disjunction of	the two
       surrounding expressions.	 It's equivalent to "||" except	for it having
       very low	precedence.  This makes	it useful for control flow:

	   print FH $data	       or die "Can't write to FH: $!";

       This means that it short-circuits: the right expression is evaluated
       only if the left	expression is false.  Due to its precedence, you must
       be careful to avoid using it as replacement for the "||"	operator.  It
       usually works out better	for flow control than in assignments:

	   $x =	$y or $z;	       # bug: this is wrong
	   ($x = $y) or	$z;	       # really	means this
	   $x =	$y || $z;	       # better	written	this way

       However,	when it's a list-context assignment and	you're trying to use
       "||" for	control	flow, you probably need	"or" so	that the assignment
       takes higher precedence.

	   @info = stat($file) || die;	   # oops, scalar sense	of stat!
	   @info = stat($file) or die;	   # better, now @info gets its	due

       Then again, you could always use	parentheses.

       Binary "xor" returns the	logical	exclusive disjunction of the two
       surrounding expressions.	 That means it returns "true" if either, but
       not both, are true.  It's equivalent to "^^" except for it having very
       low precedence.	It cannot short-circuit	(of course).  It tends to be
       used to verify that two mutually-exclusive conditions are actually
       mutually	exclusive.  For	example, in Perl's test	suite, we might	want
       to test that a regular expression pattern can't both match and not
       match, for otherwise it would be	a bug in our pattern matching code.

	($x =~ qr/$pat/	xor $x !~ qr/$pat/) or die;

   C Operators Missing From Perl
       Here is what C has that Perl doesn't:

       unary & Address-of operator.  (But see the "\" operator for taking a
	       reference.)

       unary * Dereference-address operator.  (Perl's prefix dereferencing
	       operators are typed: "$", "@", "%", and "&".)

       (TYPE)  Type-casting operator.

   Quote and Quote-like	Operators
       While we	usually	think of quotes	as literal values, in Perl they
       function	as operators, providing	various	kinds of interpolating and
       pattern matching	capabilities.  Perl provides customary quote
       characters for these behaviors, but also	provides a way for you to
       choose your quote character for any of them.  In	the following table, a
       "{}" represents any pair	of delimiters you choose.

	   Customary  Generic	     Meaning	    Interpolates
	       ''	q{}	     Literal		 no
	       ""      qq{}	     Literal		 yes
	       ``      qx{}	     Command		 yes*
		       qw{}	    Word list		 no
	       //	m{}	  Pattern match		 yes*
		       qr{}	     Pattern		 yes*
			s{}{}	   Substitution		 yes*
		       tr{}{}	 Transliteration	 no (but see below)
			y{}{}	 Transliteration	 no (but see below)
	       <<EOF		     here-doc		 yes*

	       * unless	the delimiter is ''.

       Non-bracketing delimiters use the same character	fore and aft, but the
       four sorts of ASCII brackets (round, angle, square, curly) all nest,
       which means that

	   q{foo{bar}baz}

       is the same as

	   'foo{bar}baz'

       Note, however, that this	does not always	work for quoting Perl code:

	   $s =	q{ if ($x eq "}") ... }; # WRONG

       is a syntax error.  The "Text::Balanced"	module (standard as of v5.8,
       and from	CPAN before then) is able to do	this properly.

       If the "extra_paired_delimiters"	feature	is enabled, then Perl will
       additionally recognise a	variety	of Unicode characters as being paired.
       For a full list,	see the	"List of Extra Paired Delimiters" at the end
       of this document.

       There can (and in some cases, must) be whitespace between the operator
       and the quoting characters, except when "#" is being used as the
       quoting character.  "q#foo#" is parsed as the string "foo", while
       "q #foo#" is the	operator "q" followed by a comment.  Its argument will
       be taken	from the next line.  This allows you to	write:

	   s {foo}  # Replace foo
	     {bar}  # with bar.

       The cases where whitespace must be used are when	the quoting character
       is a word character (meaning it matches "/\w/"):

	   q XfooX # Works: means the string 'foo'
	   qXfooX  # WRONG!

       The following escape sequences are available in constructs that
       interpolate, and	in transliterations whose delimiters aren't single
       quotes ("'").  In all the ones with braces, any number of blanks	and/or
       tabs adjoining and within the braces are	allowed	(and ignored).

	   Sequence	Note  Description
	   \t		       tab		 (HT, TAB)
	   \n		       newline		 (NL)
	   \r		       return		 (CR)
	   \f		       form feed	 (FF)
	   \b		       backspace	 (BS)
	   \a		       alarm (bell)	 (BEL)
	   \e		       escape		 (ESC)
	   \x{263A}	[1,8]  hex char		 (example shown: SMILEY)
	   \x{ 263A }	       Same, but shows optional	blanks inside and
			       adjoining the braces
	   \x1b		[2,8]  restricted range	hex char (example: ESC)
	   \N{name}	[3]    named Unicode character or character sequence
	   \N{U+263D}	[4,8]  Unicode character (example: FIRST QUARTER MOON)
	   \c[		[5]    control char	 (example: chr(27))
	   \o{23072}	[6,8]  octal char	 (example: SMILEY)
	   \033		[7,8]  restricted range	octal char  (example: ESC)

       Note that any escape sequence using braces inside interpolated
       constructs may have optional blanks (tab	or space characters) adjoining
       with and	inside of the braces, as illustrated above by the second
       "\x{ }" example.

       [1] The result is the character specified by the	hexadecimal number
	   between the braces.	See "[8]" below	for details on which
	   character.

	   Blanks (tab or space	characters) may	separate the number from
	   either or both of the braces.

	   Otherwise, only hexadecimal digits are valid	between	the braces.
	   If an invalid character is encountered, a warning will be issued
	   and the invalid character and all subsequent	characters (valid or
	   invalid) within the braces will be discarded.

	   If there are	no valid digits	between	the braces, the	generated
	   character is	the NULL character ("\x{00}").	However, an explicit
	   empty brace ("\x{}")	will not cause a warning (currently).

       [2] The result is the character specified by the	hexadecimal number in
	   the range 0x00 to 0xFF.  See	"[8]" below for	details	on which
	   character.

	   Only	hexadecimal digits are valid following "\x".  When "\x"	is
	   followed by fewer than two valid digits, any	valid digits will be
	   zero-padded.	 This means that "\x7" will be interpreted as "\x07",
	   and a lone "\x" will	be interpreted as "\x00".  Except at the end
	   of a	string,	having fewer than two valid digits will	result in a
	   warning.  Note that although	the warning says the illegal character
	   is ignored, it is only ignored as part of the escape	and will still
	   be used as the subsequent character in the string.  For example:

	       Original	   Result    Warns?
	       "\x7"	   "\x07"    no
	       "\x"	   "\x00"    no
	       "\x7q"	   "\x07q"   yes
	       "\xq"	   "\x00q"   yes

       [3] The result is the Unicode character or character sequence given by
	   name.  See charnames.

       [4] "\N{U+hexadecimal number}" means the	Unicode	character whose
	   Unicode code	point is hexadecimal number.

       [5] The character following "\c"	is mapped to some other	character as
	   shown in the	table:

	       Sequence	  Value
		 \c@	  chr(0)
		 \cA	  chr(1)
		 \ca	  chr(1)
		 \cB	  chr(2)
		 \cb	  chr(2)
		 ...
		 \cZ	  chr(26)
		 \cz	  chr(26)
		 \c[	  chr(27)
				   # See below for chr(28)
		 \c]	  chr(29)
		 \c^	  chr(30)
		 \c_	  chr(31)
		 \c?	  chr(127) # (on ASCII platforms; see below for	link to
				   #  EBCDIC discussion)

	   In other words, it's	the character whose code point has had 64
	   xor'd with its uppercase.  "\c?" is DELETE on ASCII platforms
	   because "ord("?") ^ 64" is 127, and "\c@" is	NULL because the ord
	   of "@" is 64, so xor'ing 64 itself produces 0.

	   Also, "\c\X"	yields " chr(28) . "X""	for any	X, but cannot come at
	   the end of a	string,	because	the backslash would be parsed as
	   escaping the	end quote.

	   On ASCII platforms, the resulting characters	from the list above
	   are the complete set	of ASCII controls.  This isn't the case	on
	   EBCDIC platforms; see "OPERATOR DIFFERENCES"	in perlebcdic for a
	   full	discussion of the differences between these for	ASCII versus
	   EBCDIC platforms.

	   Use of any other character following	the "c"	besides	those listed
	   above is discouraged, and as	of Perl	v5.20, the only	characters
	   actually allowed are	the printable ASCII ones, minus	the left brace
	   "{".	 What happens for any of the allowed other characters is that
	   the value is	derived	by xor'ing with	the seventh bit, which is 64,
	   and a warning raised	if enabled.  Using the non-allowed characters
	   generates a fatal error.

	   To get platform independent controls, you can use "\N{...}".

       [6] The result is the character specified by the	octal number between
	   the braces.	See "[8]" below	for details on which character.

	   Blanks (tab or space	characters) may	separate the number from
	   either or both of the braces.

	   Otherwise, if a character that isn't	an octal digit is encountered,
	   a warning is	raised,	and the	value is based on the octal digits
	   before it, discarding it and	all following characters up to the
	   closing brace.  It is a fatal error if there	are no octal digits at
	   all.

       [7] The result is the character specified by the	three-digit octal
	   number in the range 000 to 777 (but best to not use above 077, see
	   next	paragraph).  See "[8]" below for details on which character.

	   Some	contexts allow 2 or even 1 digit, but any usage	without
	   exactly three digits, the first being a zero, may give unintended
	   results.  (For example, in a	regular	expression it may be confused
	   with	a backreference; see "Octal escapes" in	perlrebackslash.)
	   Starting in Perl 5.14, you may use "\o{}" instead, which avoids all
	   these problems.  Otherwise, it is best to use this construct	only
	   for ordinals	"\077" and below, remembering to pad to	the left with
	   zeros to make three digits.	For larger ordinals, either use
	   "\o{}", or convert to something else, such as to hex	and use
	   "\N{U+}" (which is portable between platforms with different
	   character sets) or "\x{}" instead.

       [8] Several constructs above specify a character	by a number.  That
	   number gives	the character's	position in the	character set encoding
	   (indexed from 0).  This is called synonymously its ordinal, code
	   position, or	code point.  Perl works	on platforms that have a
	   native encoding currently of	either ASCII/Latin1 or EBCDIC, each of
	   which allow specification of	256 characters.	 In general, if	the
	   number is 255 (0xFF,	0377) or below,	Perl interprets	this in	the
	   platform's native encoding.	If the number is 256 (0x100, 0400) or
	   above, Perl interprets it as	a Unicode code point and the result is
	   the corresponding Unicode character.	 For example "\x{50}" and
	   "\o{120}" both are the number 80 in decimal,	which is less than
	   256,	so the number is interpreted in	the native character set
	   encoding.  In ASCII the character in	the 80th position (indexed
	   from	0) is the letter "P", and in EBCDIC it is the ampersand	symbol
	   "&".	 "\x{100}" and "\o{400}" are both 256 in decimal, so the
	   number is interpreted as a Unicode code point no matter what	the
	   native encoding is.	The name of the	character in the 256th
	   position (indexed by	0) in Unicode is "LATIN	CAPITAL	LETTER A WITH
	   MACRON".

	   An exception	to the above rule is that "\N{U+hex number}" is	always
	   interpreted as a Unicode code point,	so that	"\N{U+0050}" is	"P"
	   even	on EBCDIC platforms.

       NOTE: Unlike C and other	languages, Perl	has no "\v" escape sequence
       for the vertical	tab (VT, which is 11 in	both ASCII and EBCDIC),	but
       you may use "\N{VT}", "\ck", "\N{U+0b}",	or "\x0b".  ("\v" does have
       meaning in regular expression patterns in Perl, see perlre.)

       The following escape sequences are available in constructs that
       interpolate, but	not in transliterations.

	   \l	       lowercase next character	only
	   \u	       titlecase (not uppercase!) next character only
	   \L	       lowercase all characters	till \E	or end of string
	   \U	       uppercase all characters	till \E	or end of string
	   \F	       foldcase	all characters till \E or end of string
	   \Q	       quote (disable) pattern metacharacters till \E or
		       end of string
	   \E	       end either case modification or quoted section
		       (whichever was last seen)

       See "quotemeta" in perlfunc for the exact definition of characters that
       are quoted by "\Q".

       "\L", "\U", "\F", and "\Q" can stack, in	which case you need one	"\E"
       for each.  For example:

	   say "This \Qquoting \ubusiness \Uhere isn't\E done yet,\E is	it?";
	   This	quoting	Business HERE ISN'T done yet, is it?

       If a "use locale" form that includes "LC_CTYPE" is in effect (see
       perllocale), the	case map used by "\l", "\L", "\u", and "\U" is taken
       from the	current	locale.	 If Unicode (for example, "\N{}" or code
       points of 0x100 or beyond) is being used, the case map used by "\l",
       "\L", "\u", and "\U" is as defined by Unicode.  That means that
       case-mapping a single character can sometimes produce a sequence	of
       several characters.  Under "use locale",	"\F" produces the same results
       as "\L" for all locales but a UTF-8 one,	where it instead uses the
       Unicode definition.

       All systems use the virtual "\n"	to represent a line terminator,	called
       a "newline".  There is no such thing as an unvarying, physical newline
       character.  It is only an illusion that the operating system, device
       drivers,	C libraries, and Perl all conspire to preserve.	 Not all
       systems read "\r" as ASCII CR and "\n" as ASCII LF.  For	example, on
       the ancient Macs	(pre-MacOS X) of yesteryear, these used	to be
       reversed, and on	systems	without	a line terminator, printing "\n" might
       emit no actual data.  In	general, use "\n" when you mean	a "newline"
       for your	system,	but use	the literal ASCII when you need	an exact
       character.  For example,	most networking	protocols expect and prefer a
       CR+LF ("\015\012" or "\cM\cJ") for line terminators, and	although they
       often accept just "\012", they seldom tolerate just "\015".  If you get
       in the habit of using "\n" for networking, you may be burned some day.

       For constructs that do interpolate, variables beginning with ""$"" or
       ""@"" are interpolated.	Subscripted variables such as $a[3] or
       "$href->{key}[0]" are also interpolated,	as are array and hash slices.
       But method calls	such as	"$obj->meth" are not.

       Interpolating an	array or slice interpolates the	elements in order,
       separated by the	value of $", so	is equivalent to interpolating
       "join $", @array".  "Punctuation" arrays	such as	"@*" are usually
       interpolated only if the	name is	enclosed in braces "@{*}", but the
       arrays @_, "@+",	and "@-" are interpolated even without braces.

       For double-quoted strings, the quoting from "\Q"	is applied after
       interpolation and escapes are processed.

	   "abc\Qfoo\tbar$s\Exyz"

       is equivalent to

	   "abc" . quotemeta("foo\tbar$s") . "xyz"

       For the pattern of regex	operators ("qr//", "m//" and "s///"), the
       quoting from "\Q" is applied after interpolation	is processed, but
       before escapes are processed.  This allows the pattern to match
       literally (except for "$" and "@").  For	example, the following
       matches:

	   '\s\t' =~ /\Q\s\t/

       Because "$" or "@" trigger interpolation, you'll	need to	use something
       like "/\Quser\E\@\Qhost/" to match them literally.

       Patterns	are subject to an additional level of interpretation as	a
       regular expression.  This is done as a second pass, after variables are
       interpolated, so	that regular expressions may be	incorporated into the
       pattern from the	variables.  If this is not what	you want, use "\Q" to
       interpolate a variable literally.

       Apart from the behavior described above,	Perl does not expand multiple
       levels of interpolation.	 In particular,	contrary to the	expectations
       of shell	programmers, back-quotes do NOT	interpolate within double
       quotes, nor do single quotes impede evaluation of variables when	used
       within double quotes.

       Simpler Quote-Like Operators

       "q/STRING/"
       'STRING'
	   A single-quoted, literal string.  A backslash represents a
	   backslash unless followed by	the delimiter or another backslash, in
	   which case the delimiter or backslash is interpolated.

	       $foo = q!I said,	"You said, 'She	said it.'"!;
	       $bar = q('This is it.');
	       $baz = '\n';		   # a two-character string

       "qq/STRING/"
       "STRING"
	   A double-quoted, interpolated string.

	       $_ .= qq
		(*** The previous line contains	the naughty word "$1".\n)
			   if /\b(tcl|java|python)\b/i;	     # :-)
	       $baz = "\n";		   # a one-character string

       "qx/STRING/"
       `STRING`
	   A string which is (possibly)	interpolated and then executed as a
	   system command, via /bin/sh or its equivalent if required.  Shell
	   wildcards, pipes, and redirections will be honored.	Similarly to
	   "system", if	the string contains no shell metacharacters then it
	   will	be executed directly.  The collected standard output of	the
	   command is returned;	standard error is unaffected.  In scalar
	   context, it comes back as a single (potentially multi-line) string,
	   or "undef" if the shell (or command)	could not be started.  In list
	   context, returns a list of lines (however you've defined lines with
	   $/ or $INPUT_RECORD_SEPARATOR), or an empty list if the shell (or
	   command) could not be started.

	       print qx/date/; # prints	"Sun Jan 28 06:16:19 CST 2024"

	   Because backticks do	not affect standard error, use shell file
	   descriptor syntax (assuming the shell supports this)	if you care to
	   address this.  To capture a command's STDERR	and STDOUT together:

	       $output = `cmd 2>&1`;

	   To capture a	command's STDOUT but discard its STDERR:

	       $output = `cmd 2>/dev/null`;

	   To capture a	command's STDERR but discard its STDOUT	(ordering is
	   important here):

	       $output = `cmd 2>&1 1>/dev/null`;

	   To exchange a command's STDOUT and STDERR in	order to capture the
	   STDERR but leave its	STDOUT to come out the old STDERR:

	       $output = `cmd 3>&1 1>&2	2>&3 3>&-`;

	   To read both	a command's STDOUT and its STDERR separately, it's
	   easiest to redirect them separately to files, and then read from
	   those files when the	program	is done:

	       system("program args 1>program.stdout 2>program.stderr");

	   The STDIN filehandle	used by	the command is inherited from Perl's
	   STDIN.  For example:

	       open(SPLAT, "stuff")   || die "can't open stuff:	$!";
	       open(STDIN, "<&SPLAT") || die "can't dupe SPLAT:	$!";
	       print STDOUT `sort`;

	   will	print the sorted contents of the file named "stuff".

	   Using single-quote as a delimiter protects the command from Perl's
	   double-quote	interpolation, passing it on to	the shell instead:

	       $perl_info  = qx(ps $$);		   # that's Perl's $$
	       $shell_info = qx'ps $$';		   # that's the	new shell's $$

	   How that string gets	evaluated is entirely subject to the command
	   interpreter on your system.	On most	platforms, you will have to
	   protect shell metacharacters	if you want them treated literally.
	   This	is in practice difficult to do,	as it's	unclear	how to escape
	   which characters.  See perlsec for a	clean and safe example of a
	   manual fork() and exec() to emulate backticks safely.

	   On some platforms (notably DOS-like ones), the shell	may not	be
	   capable of dealing with multiline commands, so putting newlines in
	   the string may not get you what you want.  You may be able to
	   evaluate multiple commands in a single line by separating them with
	   the command separator character, if your shell supports that	(for
	   example, ";"	on many	Unix shells and	"&" on the Windows NT "cmd"
	   shell).

	   Perl	will attempt to	flush all files	opened for output before
	   starting the	child process, but this	may not	be supported on	some
	   platforms (see perlport).  To be safe, you may need to set $|
	   ($AUTOFLUSH in "English") or	call the autoflush() method of
	   "IO::Handle"	on any open handles.

	   Beware that some command shells may place restrictions on the
	   length of the command line.	You must ensure	your strings don't
	   exceed this limit after any necessary interpolations.  See the
	   platform-specific release notes for more details about your
	   particular environment.

	   Using this operator can lead	to programs that are difficult to
	   port, because the shell commands called vary	between	systems, and
	   may in fact not be present at all.  As one example, the "type"
	   command under the POSIX shell is very different from	the "type"
	   command under DOS.  That doesn't mean you should go out of your way
	   to avoid backticks when they're the right way to get	something
	   done.  Perl was made	to be a	glue language, and one of the things
	   it glues together is	commands.  Just	understand what	you're getting
	   yourself into.

	   Like	"system", backticks put	the child process exit code in $?.  If
	   you'd like to manually inspect failure, you can check all possible
	   failure modes by inspecting $? like this:

	       if ($? == -1) {
		   print "failed to execute: $!\n";
	       }
	       elsif ($? & 127)	{
		   printf "child died with signal %d, %s coredump\n",
		       ($? & 127),  ($?	& 128) ? 'with'	: 'without';
	       }
	       else {
		   printf "child exited	with value %d\n", $? >>	8;
	       }

	   Use the open	pragma to control the I/O layers used when reading the
	   output of the command, for example:

	       use open	IN => ":encoding(UTF-8)";
	       my $x = `cmd-producing-utf-8`;

	   "qx//" can also be called like a function with "readpipe" in
	   perlfunc.

	   See "I/O Operators" for more	discussion.

       "qw/STRING/"
	   Evaluates to	a list of the words extracted out of STRING, using
	   embedded whitespace as the word delimiters.	It can be understood
	   as being roughly equivalent to:

	       split(" ", q/STRING/);

	   the differences being that it only splits on	ASCII whitespace,
	   generates a real list at compile time, and in scalar	context	it
	   returns the last element in the list.  So this expression:

	       qw(foo bar baz)

	   is semantically equivalent to the list:

	       "foo", "bar", "baz"

	   Some	frequently seen	examples:

	       use POSIX qw( setlocale localeconv )
	       @EXPORT = qw( foo bar baz );

	   Common mistakes are trying to separate the words with commas,
	   trying to put comments into a multi-line "qw"-string, or trying to
	   "\"-escape the space	between	words. For this	reason,	the
	   "use	warnings" pragma and the -w switch (that is, the $^W variable)
	   produce warnings if the STRING contains the ",", "#", or "\"
	   characters.

       Regexp Quote-Like Operators

       Here are	the quote-like operators that apply to pattern matching	and
       related activities.

       "qr/STRING/msixpodualn"
	       This operator quotes (and possibly compiles) its	STRING as a
	       regular expression.  STRING is interpolated the same way	as
	       PATTERN in "m/PATTERN/".	 If "'"	is used	as the delimiter, no
	       variable	interpolation is done.	Returns	a Perl value which may
	       be used instead of the corresponding "/STRING/msixpodualn"
	       expression.  The	returned value is a normalized version of the
	       original	pattern.  It magically differs from a string
	       containing the same characters: ref(qr/x/) returns "Regexp";
	       however,	dereferencing it is not	well defined (you currently
	       get the normalized version of the original pattern, but this
	       may change).

	       For example,

		   $rex	= qr/my.STRING/is;
		   print $rex;		       # prints	(?si-xm:my.STRING)
		   s/$rex/foo/;

	       is equivalent to

		   s/my.STRING/foo/is;

	       The result may be used as a subpattern in a match:

		   $re = qr/$pattern/;
		   $string =~ /foo${re}bar/;   # can be	interpolated in	other
					       # patterns
		   $string =~ $re;	       # or used standalone
		   $string =~ /$re/;	       # or this way

	       Since Perl may compile the pattern at the moment	of execution
	       of the qr() operator, using qr()	may have speed advantages in
	       some situations,	notably	if the result of qr() is used
	       standalone:

		   sub match {
		       my $patterns = shift;
		       my @compiled = map qr/$_/i, @$patterns;
		       grep {
			   my $success = 0;
			   foreach my $pat (@compiled) {
			       $success	= 1, last if /$pat/;
			   }
			   $success;
		       } @_;
		   }

	       Precompilation of the pattern into an internal representation
	       at the moment of	qr() avoids the	need to	recompile the pattern
	       every time a match "/$pat/" is attempted.  (Perl	has many other
	       internal	optimizations, but none	would be triggered in the
	       above example if	we did not use qr() operator.)

	       Options (specified by the following modifiers) are:

		   m   Treat string as multiple	lines.
		   s   Treat string as single line. (Make . match a newline)
		   i   Do case-insensitive pattern matching.
		   x   Use extended regular expressions; specifying two
		       x's means \t and	the SPACE character are	ignored	within
		       square-bracketed	character classes
		   p   When matching preserve a	copy of	the matched string so
		       that ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} will	be
		       defined (ignored	starting in v5.20 as these are always
		       defined starting	in that	release)
		   o   Compile pattern only once.
		   a   ASCII-restrict: Use ASCII for \d, \s, \w	and [[:posix:]]
		       character classes; specifying two a's adds the further
		       restriction that	no ASCII character will	match a
		       non-ASCII one under /i.
		   l   Use the current run-time	locale's rules.
		   u   Use Unicode rules.
		   d   Use Unicode or native charset, as in 5.12 and earlier.
		   n   Non-capture mode. Don't let () fill in $1, $2, etc...

	       If a precompiled	pattern	is embedded in a larger	pattern	then
	       the effect of "msixpluadn" will be propagated appropriately.
	       The effect that the "/o"	modifier has is	not propagated,	being
	       restricted to those patterns explicitly using it.

	       The "/a", "/d", "/l", and "/u" modifiers	(added in Perl 5.14)
	       control the character set rules,	but "/a" is the	only one you
	       are likely to want to specify explicitly; the other three are
	       selected	automatically by various pragmas.

	       See perlre for additional information on	valid syntax for
	       STRING, and for a detailed look at the semantics	of regular
	       expressions.  In	particular, all	modifiers except the largely
	       obsolete	"/o" are further explained in "Modifiers" in perlre.
	       "/o" is described in the	next section.

       "m/PATTERN/msixpodualngc"
       "/PATTERN/msixpodualngc"
	       Searches	a string for a pattern match, and in scalar context
	       returns true if it succeeds, false if it	fails.	If no string
	       is specified via	the "=~" or "!~" operator, the $_ string is
	       searched.  (The string specified	with "=~" need not be an
	       lvalue--it may be the result of an expression evaluation, but
	       remember	the "=~" binds rather tightly.)	 See also perlre.

	       Options are as described	in "qr//" above; in addition, the
	       following match process modifiers are available:

		   g  Match globally, i.e., find all occurrences.
		   c  Do not reset search position on a	failed match when /g is
		      in effect.

	       If "/" is the delimiter then the	initial	"m" is optional.  With
	       the "m" you can use any pair of non-whitespace (ASCII)
	       characters as delimiters.  This is particularly useful for
	       matching	path names that	contain	"/", to	avoid LTS (leaning
	       toothpick syndrome).  If	"?" is the delimiter, then a
	       match-only-once rule applies, described in "m?PATTERN?" below.
	       If "'" (single quote) is	the delimiter, no variable
	       interpolation is	performed on the PATTERN.  When	using a
	       delimiter character valid in an identifier, whitespace is
	       required	after the "m".

	       PATTERN may contain variables, which will be interpolated every
	       time the	pattern	search is evaluated, except for	when the
	       delimiter is a single quote.  (Note that	$(, $),	and $| are not
	       interpolated because they look like end-of-string tests.)  Perl
	       will not	recompile the pattern unless an	interpolated variable
	       that it contains	changes.  You can force	Perl to	skip the test
	       and never recompile by adding a "/o" (which stands for "once")
	       after the trailing delimiter.  Once upon	a time,	Perl would
	       recompile regular expressions unnecessarily, and	this modifier
	       was useful to tell it not to do so, in the interests of speed.
	       But now,	the only reasons to use	"/o" are one of:

	       1.  The variables are thousands of characters long and you know
		   that	they don't change, and you need	to wring out the last
		   little bit of speed by having Perl skip testing for that.
		   (There is a maintenance penalty for doing this, as
		   mentioning "/o" constitutes a promise that you won't	change
		   the variables in the	pattern.  If you do change them, Perl
		   won't even notice.)

	       2.  you want the	pattern	to use the initial values of the
		   variables regardless	of whether they	change or not.	(But
		   there are saner ways	of accomplishing this than using
		   "/o".)

	       3.  If the pattern contains embedded code, such as

		       use re 'eval';
		       $code = 'foo(?{ $x })';
		       /$code/

		   then	perl will recompile each time, even though the pattern
		   string hasn't changed, to ensure that the current value of
		   $x is seen each time.  Use "/o" if you want to avoid	this.

	       The bottom line is that using "/o" is almost never a good idea.

       The empty pattern "//"
	       (This subsection	applies	to "//", "m//",	and "s///", but	not to
	       "qr//".)

	       If the PATTERN evaluates	to the empty string, the last
	       successfully matched regular expression in the current dynamic
	       scope is	used instead (see also "Scoping	Rules of Regex
	       Variables" in perlvar).	In this	case, only the "g" and "c"
	       flags on	the empty pattern are honored; the other flags are
	       taken from the original pattern.	If no match has	previously
	       succeeded, this will (silently) act instead as a	genuine	empty
	       pattern (which will always match). Using	a user supplied	string
	       as a pattern has	the risk that if the string is empty that it
	       triggers	the "last successful match" behavior, which can	be
	       very confusing. In such cases you are recommended to replace
	       "m/$pattern/" with "m/(?:$pattern)/" to avoid this behavior.

	       The last	successful pattern may be accessed as a	variable via
	       "${^LAST_SUCCESSFUL_PATTERN}". Matching against it, or the
	       empty pattern should have the same effect, with the exception
	       that when there is no last successful pattern the empty pattern
	       will silently match, whereas using the
	       "${^LAST_SUCCESSFUL_PATTERN}" variable will produce undefined
	       warnings	(if warnings are enabled). You can check
	       defined(${^LAST_SUCCESSFUL_PATTERN}) to test if there is	a
	       "last successful	match" in the current scope.

	       Note that it's possible to confuse Perl into thinking "//" (the
	       empty regex) is really "//" (the	defined-or operator).  Perl is
	       usually pretty good about this, but some	pathological cases
	       might trigger this, such	as "$x///" (is that "($x) / (//)" or
	       "$x // /"?) and "print $fh //" ("print $fh(//" or
	       "print($fh //"?).  In all of these examples, Perl will assume
	       you meant defined-or.  If you meant the empty regex, just use
	       parentheses or spaces to	disambiguate, or even prefix the empty
	       regex with an "m" (so "//" becomes "m//").

       Matching	in list	context
	       If the "/g" option is not used, "m//" in	list context returns a
	       list consisting of the subexpressions matched by	the
	       parentheses in the pattern, that	is, ($1, $2, $3...)  (Note
	       that here $1 etc. are also set).	 When there are	no parentheses
	       in the pattern, the return value	is the list "(1)" for success.
	       With or without parentheses, an empty list is returned upon
	       failure.

	       Examples:

		   open(TTY, "+</dev/tty")
		      || die "can't access /dev/tty: $!";

		   <TTY> =~ /^y/i && foo();	  # do foo if desired

		   if (/Version: *([0-9.]*)/) {	$version = $1; }

		   next	if m#^/usr/spool/uucp#;

		   # poor man's	grep
		   $arg	= shift;
		   while (<>) {
		      print if /$arg/;
		   }
		   if (($F1, $F2, $Etc)	= ($foo	=~ /^(\S+)\s+(\S+)\s*(.*)/))

	       This last example splits	$foo into the first two	words and the
	       remainder of the	line, and assigns those	three fields to	$F1,
	       $F2, and	$Etc.  The conditional is true if any variables	were
	       assigned; that is, if the pattern matched.

	       The "/g"	modifier specifies global pattern matching--that is,
	       matching	as many	times as possible within the string.  How it
	       behaves depends on the context.	In list	context, it returns a
	       list of the substrings matched by any capturing parentheses in
	       the regular expression.	If there are no	parentheses, it
	       returns a list of all the matched strings, as if	there were
	       parentheses around the whole pattern.

	       In scalar context, each execution of "m//g" finds the next
	       match, returning	true if	it matches, and	false if there is no
	       further match.  The position after the last match can be	read
	       or set using the	pos() function;	see "pos" in perlfunc.	A
	       failed match normally resets the	search position	to the
	       beginning of the	string,	but you	can avoid that by adding the
	       "/c" modifier (for example, "m//gc").  Modifying	the target
	       string also resets the search position.

       "\G assertion"
	       You can intermix	"m//g" matches with "m/\G.../g", where "\G" is
	       a zero-width assertion that matches the exact position where
	       the previous "m//g", if any, left off.  Without the "/g"
	       modifier, the "\G" assertion still anchors at pos() as it was
	       at the start of the operation (see "pos"	in perlfunc), but the
	       match is	of course only attempted once.	Using "\G" without
	       "/g" on a target	string that has	not previously had a "/g"
	       match applied to	it is the same as using	the "\A" assertion to
	       match the beginning of the string.  Note	also that, currently,
	       "\G" is only properly supported when anchored at	the very
	       beginning of the	pattern.

	       Examples:

		   # list context
		   ($one,$five,$fifteen) = (`uptime` =~	/(\d+\.\d+)/g);

		   # scalar context
		   local $/ = "";
		   while ($paragraph = <>) {
		       while ($paragraph =~ /\p{Ll}['")]*[.!?]+['")]*\s/g) {
			   $sentences++;
		       }
		   }
		   say $sentences;

	       Here's another way to check for sentences in a paragraph:

		   my $sentence_rx = qr{
		       (?: (?<=	^ ) | (?<= \s )	)  # after start-of-string or
						   # whitespace
		       \p{Lu}			   # capital letter
		       .*?			   # a bunch of	anything
		       (?<= \S )		   # that ends in non-
						   # whitespace
		       (?<! \b [DMS]r  )	   # but isn't a common	abbr.
		       (?<! \b Mrs )
		       (?<! \b Sra )
		       (?<! \b St  )
		       [.?!]			   # followed by a sentence
						   # ender
		       (?= $ | \s )		   # in	front of end-of-string
						   # or	whitespace
		   }sx;
		   local $/ = "";
		   while (my $paragraph	= <>) {
		       say "NEW	PARAGRAPH";
		       my $count = 0;
		       while ($paragraph =~ /($sentence_rx)/g) {
			   printf "\tgot sentence %d: <%s>\n", ++$count, $1;
		       }
		   }

	       Here's how to use "m//gc" with "\G":

		   $_ =	"ppooqppqq";
		   while ($i++ < 2) {
		       print "1: '";
		       print $1	while /(o)/gc; print "', pos=",	pos, "\n";
		       print "2: '";
		       print $1	if /\G(q)/gc;  print "', pos=",	pos, "\n";
		       print "3: '";
		       print $1	while /(p)/gc; print "', pos=",	pos, "\n";
		   }
		   print "Final: '$1', pos=",pos,"\n" if /\G(.)/;

	       The last	example	should print:

		   1: 'oo', pos=4
		   2: 'q', pos=5
		   3: 'pp', pos=7
		   1: '', pos=7
		   2: 'q', pos=8
		   3: '', pos=8
		   Final: 'q', pos=8

	       Notice that the final match matched "q" instead of "p", which a
	       match without the "\G" anchor would have	done.  Also note that
	       the final match did not update "pos".  "pos" is only updated on
	       a "/g" match.  If the final match did indeed match "p", it's a
	       good bet	that you're running an ancient (pre-5.6.0) version of
	       Perl.

	       A useful	idiom for "lex"-like scanners is "/\G.../gc".  You can
	       combine several regexps like this to process a string
	       part-by-part, doing different actions depending on which	regexp
	       matched.	 Each regexp tries to match where the previous one
	       leaves off.

		   $_ =	<<'EOL';
		       $url = URI::URL->new( "http://example.com/" );
		       die if $url eq "xXx";
		   EOL

		   LOOP: {
		       print(" digits"),       redo LOOP if /\G\d+\b[,.;]?\s*/gc;
		       print(" lowercase"),    redo LOOP
						     if	/\G\p{Ll}+\b[,.;]?\s*/gc;
		       print(" UPPERCASE"),    redo LOOP
						     if	/\G\p{Lu}+\b[,.;]?\s*/gc;
		       print(" Capitalized"),  redo LOOP
					       if /\G\p{Lu}\p{Ll}+\b[,.;]?\s*/gc;
		       print(" MiXeD"),	       redo LOOP
							if /\G\pL+\b[,.;]?\s*/gc;
		       print(" alphanumeric"), redo LOOP
					     if	/\G[\p{Alpha}\pN]+\b[,.;]?\s*/gc;
		       print(" line-noise"),   redo LOOP if /\G\W+/gc;
		       print ".	That's all!\n";
		   }

	       Here is the output (split into several lines):

		   line-noise lowercase	line-noise UPPERCASE line-noise	UPPERCASE
		   line-noise lowercase	line-noise lowercase line-noise	lowercase
		   lowercase line-noise	lowercase lowercase line-noise lowercase
		   lowercase line-noise	MiXeD line-noise. That's all!

       "m?PATTERN?msixpodualngc"
	       This is just like the "m/PATTERN/" search, except that it
	       matches only once between calls to the reset() operator.	 This
	       is a useful optimization	when you want to see only the first
	       occurrence of something in each file of a set of	files, for
	       instance.  Only "m??"  patterns local to	the current package
	       are reset.

		   while (<>) {
		       if (m?^$?) {
					   # blank line	between	header and body
		       }
		   } continue {
		       reset if	eof;	   # clear m?? status for next file
		   }

	       Another example switched	the first "latin1" encoding it finds
	       to "utf8" in a pod file:

		   s//utf8/ if m? ^ =encoding \h+ \K latin1 ?x;

	       The match-once behavior is controlled by	the match delimiter
	       being "?"; with any other delimiter this	is the normal "m//"
	       operator.

	       In the past, the	leading	"m" in "m?PATTERN?" was	optional, but
	       omitting	it would produce a deprecation warning.	 As of
	       v5.22.0,	omitting it produces a syntax error.  If you encounter
	       this construct in older code, you can just add "m".

       "s/PATTERN/REPLACEMENT/msixpodualngcer"
	       Searches	a string for a pattern,	and if found, replaces that
	       pattern with the	replacement text and returns the number	of
	       substitutions made.  Otherwise it returns false (a value	that
	       is both an empty	string ("") and	numeric	zero (0) as described
	       in "Relational Operators").

	       If the "/r" (non-destructive) option is used then it runs the
	       substitution on a copy of the string and	instead	of returning
	       the number of substitutions, it returns the copy	whether	or not
	       a substitution occurred.	 The original string is	never changed
	       when "/r" is used.  The copy will always	be a plain string,
	       even if the input is an object or a tied	variable.

	       If no string is specified via the "=~" or "!~" operator,	the $_
	       variable	is searched and	modified.  Unless the "/r" option is
	       used, the string	specified must be a scalar variable, an	array
	       element,	a hash element,	or an assignment to one	of those; that
	       is, some	sort of	scalar lvalue.

	       If the delimiter	chosen is a single quote, no variable
	       interpolation is	done on	either the PATTERN or the REPLACEMENT.
	       Otherwise, if the PATTERN contains a "$"	that looks like	a
	       variable	rather than an end-of-string test, the variable	will
	       be interpolated into the	pattern	at run-time.  If you want the
	       pattern compiled	only once the first time the variable is
	       interpolated, use the "/o" option.  If the pattern evaluates to
	       the empty string, the last successfully executed	regular
	       expression is used instead.  See	perlre for further explanation
	       on these.

	       Options are as with "m//" with the addition of the following
	       replacement specific options:

		   e   Evaluate	the right side as a block of code.
		   ee  Evaluate	the right side as a block of code, then	eval()
		       the resulting string.
		   r   Return substitution and leave the original string
		       untouched.

	       Any non-whitespace delimiter may	replace	the slashes.  Add
	       space after the "s" when	using a	character allowed in
	       identifiers.  If	single quotes are used,	no interpretation is
	       done on the replacement string (the "/e"	modifier overrides
	       this, however).	Note that Perl treats backticks	as normal
	       delimiters; the replacement text	is not evaluated as a command.
	       If the PATTERN is delimited by bracketing quotes, the
	       REPLACEMENT has its own pair of quotes, which may or may	not be
	       bracketing quotes, for example, "s(foo)(bar)" or	"s<foo>/bar/".
	       A "/e" will cause the replacement portion to be treated as a
	       full-fledged block of Perl code and evaluated right then	and
	       there.  It is, however, syntax checked at compile-time.	A
	       second "e" modifier will	cause the result of the	block of code
	       to be "eval"ed.

	       That is,	"s/FOO/BAR/e" will compute the replacement string at
	       match time as if	it had been written as "do { BAR }" (see "do
	       BLOCK" in perlfunc).  Each additional "e" modifier wraps	a call
	       to "eval" around	the result: "s/FOO/BAR/ee" will	compute	the
	       replacement string like "eval(do	{ BAR })", "s/FOO/BAR/eee"
	       like "eval(eval(do { BAR	}))", etc.

	       Examples:

		   s/\bgreen\b/mauve/g;		     # don't change wintergreen

		   $path =~ s|/usr/bin|/usr/local/bin|;

		   s/Login: $foo/Login:	$bar/; # run-time pattern

		   ($foo = $bar) =~ s/this/that/;      # copy first, then
						       # change
		   ($foo = "$bar") =~ s/this/that/;    # convert to string,
						       # copy, then change
		   $foo	= $bar =~ s/this/that/r;       # Same as above using /r
		   $foo	= $bar =~ s/this/that/r
			       =~ s/that/the other/r;  # Chained substitutes
						       # using /r
		   @foo	= map {	s/this/that/r }	@bar   # /r is very useful in
						       # maps

		   $count = ($paragraph	=~ s/Mister\b/Mr./g);  # get change-cnt

		   $_ =	'abc123xyz';
		   s/\d+/$&*2/e;	       # yields	'abc246xyz'
		   s/\d+/sprintf("%5d",$&)/e;  # yields	'abc  246xyz'
		   s/\w/$& x 2/eg;	       # yields	'aabbcc	 224466xxyyzz'

		   s/%(.)/$percent{$1}/g;      # change	percent	escapes; no /e
		   s/%(.)/$percent{$1} || $&/ge;       # expr now, so /e
		   s/^=(\w+)/pod($1)/ge;       # use function call

		   $_ =	'abc123xyz';
		   $x =	s/abc/def/r;	       # $x is 'def123xyz' and
					       # $_ remains 'abc123xyz'.

		   # expand variables in $_, but dynamics only,	using
		   # symbolic dereferencing
		   s/\$(\w+)/${$1}/g;

		   # Add one to	the value of any numbers in the	string
		   s/(\d+)/1 + $1/eg;

		   # Titlecase words in	the last 30 characters only (presuming
		   # that the substring	doesn't	start in the middle of a word)
		   substr($str,	-30) =~	s/\b(\p{Alpha})(\p{Alpha}*)\b/\u$1\L$2/g;

		   # This will expand any embedded scalar variable
		   # (including	lexicals) in $_	: First	$1 is interpolated
		   # to	the variable name, and then evaluated
		   s/(\$\w+)/$1/eeg;

		   # Same as above, but	perhaps	clearer
		   s/(\$\w+)/eval($1)/eg;

		   # Delete (most) C comments.
		   $program =~ s {
		       /\*     # Match the opening delimiter.
		       .*?     # Match a minimal number	of characters.
		       \*/     # Match the closing delimiter.
		   } []gsx;

		   s/^\s*(.*?)\s*$/$1/;	       # trim whitespace in $_,
					       # expensively

		   for ($variable) {	       # trim whitespace in $variable,
					       # cheap
		       s/^\s+//;
		       s/\s+$//;
		   }

		   s/([^ ]*) *([^ ]*)/$2 $1/;  # reverse 1st two fields

		   $foo	!~ s/A/a/g;    # Lowercase all A's in $foo; return
				       # 0 if any were found and changed;
				       # otherwise return 1

	       Note the	use of "$" instead of "\" in the last example.	Unlike
	       sed, we use the \<digit>	form only in the left hand side.
	       Anywhere	else it's $<digit>.

	       Occasionally, you can't use just	a "/g" to get all the changes
	       to occur	that you might want.  Here are two common cases:

		   # put commas	in the right places in an integer
		   1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/g;

		   # expand tabs to 8-column spacing
		   1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e;

	       While "s///" accepts the	"/c" flag, it has no effect beyond
	       producing a warning if warnings are enabled.

       Transliteration Quote-Like Operators

       "tr/SEARCHLIST/REPLACEMENTLIST/cdsr"
       "y/SEARCHLIST/REPLACEMENTLIST/cdsr"
	   These transliterate all occurrences of the characters found (or not
	   found if the	"/c" modifier is specified) in the search list with
	   the positionally corresponding character in the replacement list,
	   possibly deleting some, depending on	the modifiers specified.
	   Unless the "/r" flag	is specified, they return the number of
	   characters replaced or deleted.  If no string is specified via the
	   "=~"	or "!~"	operator, the $_ string	is transliterated.

	   For sed devotees, "y" is provided as	a synonym for "tr".

	   If the "/r" (non-destructive) option	is present, a new copy of the
	   string is made and its characters transliterated, and this copy is
	   returned, instead of	a count, no matter whether it was modified or
	   not:	the original string is always left unchanged.  The new copy is
	   always a plain string, even if the input string is an object	or a
	   tied	variable.

	   Unless the "/r" option is used, the string specified	with "=~" must
	   be a	scalar variable, an array element, a hash element, or an
	   assignment to one of	those; in other	words, an lvalue.

	   The characters delimiting SEARCHLIST	and REPLACEMENTLIST can	be any
	   printable character,	not just forward slashes.  If they are single
	   quotes ("tr'SEARCHLIST'REPLACEMENTLIST'"), the only interpolation
	   is removal of "\" from pairs	of "\\"; so hyphens are	interpreted
	   literally rather than specifying a character	range.

	   Otherwise, a	character range	may be specified with a	hyphen,	so
	   "tr/A-J/0-9/" does the same replacement as
	   "tr/ACEGIBDFHJ/0246813579/".

	   If the SEARCHLIST is	delimited by bracketing	quotes,	the
	   REPLACEMENTLIST must	have its own pair of quotes, which may or may
	   not be bracketing quotes; for example, "tr(aeiouy)(yuoiea)" or
	   "tr[+\-*/]"ABCD"".  This final example shows	a way to visually
	   clarify what	is going on for	people who are more familiar with
	   regular expression patterns than with "tr", and who may think
	   forward slash delimiters imply that "tr" is more like a regular
	   expression pattern than it actually is.  (Another option might be
	   to use "tr[...][...]".)

	   "tr"	isn't fully like bracketed character classes, just
	   (significantly) more	like them than it is to	full patterns.	For
	   example, characters appearing more than once	in either list behave
	   differently here than in patterns, and "tr" lists do	not allow
	   backslashed character classes such as "\d" or "\pL",	nor variable
	   interpolation, so "$" and "@" are always treated as literals.

	   The allowed elements	are literals plus "\'" (meaning	a single
	   quote).  If the delimiters aren't single quotes, also allowed are
	   any of the escape sequences accepted	in double-quoted strings.
	   Escape sequence details are in the table near the beginning of this
	   section.

	   A hyphen at the beginning or	end, or	preceded by a backslash	is
	   also	always considered a literal.  Precede a	delimiter character
	   with	a backslash to allow it.

	   The "tr" operator is	not equivalent to the "tr(1)" utility.
	   "tr[a-z][A-Z]" will uppercase the 26	letters	"a" through "z", but
	   for case changing not confined to ASCII, use	"lc", "uc", "lcfirst",
	   "ucfirst" (all documented in	perlfunc), or the substitution
	   operator "s/PATTERN/REPLACEMENT/" (with "\U", "\u", "\L", and "\l"
	   string-interpolation	escapes	in the REPLACEMENT portion).

	   Most	ranges are unportable between character	sets, but certain ones
	   signal Perl to do special handling to make them portable.  There
	   are two classes of portable ranges.	The first are any subsets of
	   the ranges "A-Z", "a-z", and	"0-9", when expressed as literal
	   characters.

	       tr/h-k/H-K/

	   capitalizes the letters "h",	"i", "j", and "k" and nothing else, no
	   matter what the platform's character	set is.	 In contrast, all of

	       tr/\x68-\x6B/\x48-\x4B/
	       tr/h-\x6B/H-\x4B/
	       tr/\x68-k/\x48-K/

	   do the same capitalizations as the previous example when run	on
	   ASCII platforms, but	something completely different on EBCDIC ones.

	   The second class of portable	ranges is invoked when one or both of
	   the range's end points are expressed	as "\N{...}"

	       $string =~ tr/\N{U+20}-\N{U+7E}//d;

	   removes from	$string	all the	platform's characters which are
	   equivalent to any of	Unicode	U+0020,	U+0021,	... U+007D, U+007E.
	   This	is a portable range, and has the same effect on	every platform
	   it is run on.  In this example, these are the ASCII printable
	   characters.	So after this is run, $string has only controls	and
	   characters which have no ASCII equivalents.

	   But,	even for portable ranges, it is	not generally obvious what is
	   included without having to look things up in	the manual.  A sound
	   principle is	to use only ranges that	both begin from, and end at,
	   either ASCII	alphabetics of equal case ("b-e", "B-E"), or digits
	   ("1-4").  Anything else is unclear (and unportable unless "\N{...}"
	   is used).  If in doubt, spell out the character sets	in full.

	   Options:

	       c   Complement the SEARCHLIST.
	       d   Delete found	but unreplaced characters.
	       r   Return the modified string instead of a count, and leave the
		   original string untouched.
	       s   Squash duplicate replaced characters.

	   If the "/d" modifier	is specified, any characters specified by
	   SEARCHLIST  not found in REPLACEMENTLIST are	deleted.  (Note	that
	   this	is slightly more flexible than the behavior of some tr
	   programs, which delete anything they	find in	the SEARCHLIST,
	   period.)

	   If the "/s" modifier	is specified, sequences	of characters, all in
	   a row, that were transliterated to the same character are squashed
	   down	to a single instance of	that character.

	       my $x = "aaabbbca";
	       $x =~ tr/ab/dd/s;     # $x now is "dcd"

	   If the "/d" modifier	is used, the REPLACEMENTLIST is	always
	   interpreted exactly as specified.  Otherwise, if the
	   REPLACEMENTLIST is shorter than the SEARCHLIST, the final
	   character, if any, is replicated until it is	long enough.  There
	   won't be a final character if and only if the REPLACEMENTLIST is
	   empty, in which case	REPLACEMENTLIST	is copied from SEARCHLIST.
	   An empty REPLACEMENTLIST is useful for counting characters in a
	   class, or for squashing character sequences in a class.

	       tr/abcd//	    tr/abcd/abcd/
	       tr/abcd/AB/	    tr/abcd/ABBB/
	       tr/abcd//d	    s/[abcd]//g
	       tr/abcd/AB/d	    (tr/ab/AB/ + s/[cd]//g)  - but run together

	   If the "/c" modifier	is specified, the characters to	be
	   transliterated are the ones NOT in SEARCHLIST, that is, it is
	   complemented.  If "/d" and/or "/s" are also specified, they apply
	   to the complemented SEARCHLIST.  Recall, that if REPLACEMENTLIST is
	   empty (except under "/d") a copy of SEARCHLIST is used instead.
	   That	copy is	made after complementing under "/c".  SEARCHLIST is
	   sorted by code point	order after complementing, and any
	   REPLACEMENTLIST  is applied to that sorted result.  This means that
	   under "/c", the order of the	characters specified in	SEARCHLIST is
	   irrelevant.	This can lead to different results on EBCDIC systems
	   if REPLACEMENTLIST contains more than one character,	hence it is
	   generally non-portable to use "/c" with such	a REPLACEMENTLIST.

	   Another way of describing the operation is this: If "/c" is
	   specified, the SEARCHLIST is	sorted by code point order, then
	   complemented.  If REPLACEMENTLIST is	empty and "/d" is not
	   specified, REPLACEMENTLIST is replaced by a copy of SEARCHLIST (as
	   modified under "/c"), and these potentially modified	lists are used
	   as the basis	for what follows.  Any character in the	target string
	   that	isn't in SEARCHLIST is passed through unchanged.  Every	other
	   character in	the target string is replaced by the character in
	   REPLACEMENTLIST that	positionally corresponds to its	mate in
	   SEARCHLIST, except that under "/s", the 2nd and following
	   characters are squeezed out in a sequence of	characters in a	row
	   that	all translate to the same character.  If SEARCHLIST is longer
	   than	REPLACEMENTLIST, characters in the target string that match a
	   character in	SEARCHLIST that	doesn't	have a correspondence in
	   REPLACEMENTLIST are either deleted from the target string if	"/d"
	   is specified; or replaced by	the final character in REPLACEMENTLIST
	   if "/d" isn't specified.

	   Some	examples:

	       $ARGV[1]	=~ tr/A-Z/a-z/;	 # canonicalize	to lower case ASCII

	       $cnt = tr/*/*/;		 # count the stars in $_
	       $cnt = tr/*//;		 # same	thing

	       $cnt = $sky =~ tr/*/*/;	 # count the stars in $sky
	       $cnt = $sky =~ tr/*//;	 # same	thing

	       $cnt = $sky =~ tr/*//c;	 # count all the non-stars in $sky
	       $cnt = $sky =~ tr/*/*/c;	 # same, but transliterate each	non-star
					 # into	a star,	leaving	the already-stars
					 # alone.  Afterwards, everything in
					 # $sky	is a star.

	       $cnt = tr/0-9//;		 # count the ASCII digits in $_

	       tr/a-zA-Z//s;		 # bookkeeper -> bokeper
	       tr/o/o/s;		 # bookkeeper -> bokkeeper
	       tr/oe/oe/s;		 # bookkeeper -> bokkeper
	       tr/oe//s;		 # bookkeeper -> bokkeper
	       tr/oe/o/s;		 # bookkeeper -> bokkopor

	       ($HOST =	$host) =~ tr/a-z/A-Z/;
		$HOST =	$host  =~ tr/a-z/A-Z/r;	# same thing

	       $HOST = $host =~	tr/a-z/A-Z/r # chained with s///r
			     =~	s/:/ -p/r;

	       tr/a-zA-Z/ /cs;		     # change non-alphas to single space

	       @stripped = map tr/a-zA-Z/ /csr,	@original;
					     # /r with map

	       tr [\200-\377]
		  [\000-\177];		     # wickedly	delete 8th bit

	       $foo !~ tr/A/a/	  # transliterate all the A's in $foo to 'a',
				  # return 0 if	any were found and changed.
				  # Otherwise return 1

	   If multiple transliterations	are given for a	character, only	the
	   first one is	used:

	       tr/AAA/XYZ/

	   will	transliterate any A to X.

	   Because the transliteration table is	built at compile time, neither
	   the SEARCHLIST nor the REPLACEMENTLIST are subjected	to double
	   quote interpolation.	 That means that if you	want to	use variables,
	   you must use	an eval():

	       eval "tr/$oldlist/$newlist/";
	       die $@ if $@;

	       eval "tr/$oldlist/$newlist/, 1" or die $@;

       Here-docs

       "<<EOT"
       "<<~EOT"
	   A line-oriented form	of quoting is based on the shell
	   "here-document" syntax.  Following a	"<<" you specify a string to
	   terminate the quoted	material, and all lines	following the current
	   line	down to	the terminating	string are the value of	the item.

	   An example is

	    my $endng =	<<WHIMPER;
	    This is the	way the	text ends.
	    This is the	way the	text ends.
	    Not	with a bang, but with a
	    WHIMPER

	   In this case, the terminator	is an identifier, the word "WHIMPER".
	   Most	usually, people	capitalize the identifier, just	so it stands
	   out,	but this is just a convention that isn't necessary.

	   The terminator may be enclosed in quotes, as	detailed below,	but
	   without them, the text of the here-doc acts exactly as if it	were
	   double-quoted.

	    my $person = 'John';

	    print uc <<EOT;
	    Hello, $person!
	    And	the text goes on.
	    EOT

	   This	yields:

	    HELLO, JOHN!
	    AND	THE TEXT GOES ON.

	   The parentheses in the "uc" function	call don't have	to be omitted:

	    print uc(<<EOT);
	    Hello, $person!
	    And	the text goes on.
	    EOT

	    HELLO, JOHN!
	    AND	THE TEXT GOES ON.

	   And you can intermix	a here-document	with other things:

	    print <<EOT, "Followed by the next argument\n";
	    Hello, $person!
	    And	the text goes on.
	    EOT

	    Hello, John!
	    And	the text goes on.
	    Followed by	the next argument

	   And you can have multiple here-documents:

	    print <<EOT1, <<EOT2;
	    Hello, $person!
	    And	the text goes on.
	    EOT1
	    Followed by	the next argument
	    EOT2

	    Hello, John!
	    And	the text goes on.
	    Followed by	the next argument

	   The terminator doesn't have to be a single word; it may also	be
	   some	quoted text:

	    my $pagliaci = << "La Commedia e finita!";
	    A troupe comes to town to perform a	play, a	comedy.	 The lead actress
	    and	lead actor are in an unhappy marriage.	On stage, he stabs her
	    for	real; then he stabs her	lover who has rushed from the audience to
	    defend her.	 Both die.
	    La Commedia	e finita!

	   There may not be a space between the	"<<" and the identifier	unless
	   the terminator is quoted, as	demonstrated in	the example just
	   above.  Quoting rules for the terminator are	unrelated to Perl's
	   quoting rules.  Only	"", '',	and `` can be used to quote it,	NOT
	   q(),	qq(), and the like.  The only interpolation is for
	   backslashing	the quoting character:

	       print <<	"abc\"def";
	       testing...
	       abc"def

	   The terminating string must appear by itself	(unquoted and with no
	   surrounding whitespace) on the terminating line.  Also, it cannot
	   span	multiple lines.	 The general rule is that the identifier must
	   be a	string literal.	 Stick with that, and you should be safe.

	   Don't forget	that you have to put a semicolon on the	end to finish
	   the statement, as Perl doesn't know you're not going	to try to do
	   this:

	       print <<ABC
	       10
	       ABC
		  + 20;

	   which prints	30 and no line terminator.

	   If you want your here-doc to	not have a line	terminator on the
	   final line, use chomp().

	       chomp($string = <<'END');
	       This is the first line.
	       This second line	won't end in a \n.
	       END

	   If you use a	here-doc within	a delimited construct, such as in
	   "s///eg", the quoted	material must still come on the	line following
	   the "<<TERMINATOR" marker, which means it may be inside the
	   delimited construct:

	       s/this/<<E . 'that'
	       the other
	       E
		. 'more	'/eg;

	   (It works this way as of Perl 5.18.	Historically, it was
	   inconsistent, and you would have to write

	       s/this/<<E . 'that'
		. 'more	'/eg;
	       the other
	       E

	   outside of string evals.)

	   A problem with the Here-doc syntax given so far is that it must be
	   at the left margin of your program, messing up the indentation.
	   Starting in Perl v5.26, the tilde "~" modifier allows you to	indent
	   your	here-docs to make the code more	readable.

	       if ($some_var) {
		   print <<~EOF;
		     This is a here-doc
		     EOF
	       }

	   This	will print...

	       This is a here-doc

	   ...with no leading whitespace.

	   The line containing the delimiter that marks	the end	of the
	   here-doc determines the indentation template	for the	whole thing.
	   Compilation croaks if any non-empty line inside the here-doc	does
	   not begin with the precise indentation of the terminating line.
	   (An empty line consists of the single character "\n".)  For
	   example, suppose the	terminating line begins	with a tab character
	   followed by 4 space characters.  Every non-empty line in the
	   here-doc must begin with a tab followed by 4	spaces.	 They are
	   stripped from each line, and	any leading white space	remaining on a
	   line	serves as the indentation for that line.  Currently, only the
	   TAB and SPACE characters are	treated	as whitespace for this
	   purpose.  Tabs and spaces may be mixed, but are matched exactly;
	   tabs	remain tabs and	are not	expanded.

	   Additional beginning	whitespace (beyond what	preceded the
	   delimiter) will be preserved:

	    print <<~EOF;
	      This text	is not indented
		This text is indented with two spaces
			   This	line is	indented with two tabs,	though those may
			   have	been converted to spaces by various filters by
			   the time you	read this.
	      EOF

       Quoting the delimiter

       As mentioned above, the terminating string may be quoted.  There	are
       three types of quoting possible.	 The type used determines the
       treatment of the	text.

       Double Quotes
	   Double quotes surrounding the terminating word or string behave as
	   if no quotes	were there, namely the text will be interpolated using
	   exactly the same rules as normal double quoted strings, as in all
	   the examples	above.	So

	    my $person = 'John';

	    print uc <<	"EOT";
	    Hello, $person!
	    And	the text goes on.
	    EOT

	   yields:

	    HELLO, JOHN!
	    AND	THE TEXT GOES ON.

	   which is the	same result as without quotes.

       Single Quotes
	   If instead, single quotes are used, the text	is treated literally,
	   with	no interpolation of its	content.

	    my $person = 'John';
	    print uc <<'EOT';
	    Hello, $person!
	    And	the text goes on.
	    EOT

	    HELLO, $PERSON!
	    AND	THE TEXT GOES ON.

	   The difference between a single-quoted here-doc and a single-quoted
	   string is that backslashes have no special meaning in a here-doc,
	   with	"\\" being treated as two backslashes and not one as they
	   would in every other	quoting	construct.

	   Just	as in the shell, a backslashed bareword	following the "<<"
	   means the same thing	as a single-quoted string does:

	       $cost = <<'VISTA';  # hasta la ...
	       That'll be $10 please, ma'am.
	       VISTA

	       $cost = <<\VISTA;   # Same thing!
	       That'll be $10 please, ma'am.
	       VISTA

	   These two forms are the only	ways of	quoting	in Perl	where there is
	   no need to worry about escaping content, something that code
	   generators can and do make good use of.

       Backticks
	   Finally, if instead backticks are used to quote the terminating
	   string, the content of the here doc is treated just as it would be
	   if it were a	string embedded	in backticks.  Thus the	content	is
	   interpolated	as though it were double quoted	and then executed via
	   the shell, with the results of the execution	returned.

	       print <<	`EOC`; # execute command and get results
	       echo hi there
	       EOC

       Gory details of parsing quoted constructs

       When presented with something that might	have several different
       interpretations,	Perl uses the DWIM (that's "Do What I Mean") principle
       to pick the most	probable interpretation.  This strategy	is so
       successful that Perl programmers	often do not suspect the ambiguity of
       what they write.	 But from time to time,	Perl's notions differ
       substantially from what the author honestly meant.

       This section hopes to clarify how Perl handles quoted constructs.
       Although	the most common	reason to learn	this is	to unravel
       labyrinthine regular expressions, because the initial steps of parsing
       are the same for	all quoting operators, they are	all discussed
       together.

       The most	important Perl parsing rule is the first one discussed below:
       when processing a quoted	construct, Perl	first finds the	end of that
       construct, then interprets its contents.	 If you	understand this	rule,
       you may skip the	rest of	this section on	the first reading.  The	other
       rules are likely	to contradict the user's expectations much less
       frequently than this first one.

       Some passes discussed below are performed concurrently, but because
       their results are the same, we consider them individually.  For
       different quoting constructs, Perl performs different numbers of
       passes, from one	to four, but these passes are always performed in the
       same order.

       Finding the end
	   The first pass is finding the end of	the quoted construct.  This
	   results in saving to	a safe location	a copy of the text (between
	   the starting	and ending delimiters),	normalized as necessary	to
	   avoid needing to know what the original delimiters were.

	   If the construct is a here-doc, the ending delimiter	is a line that
	   has a terminating string as the content.  Therefore "<<EOF" is
	   terminated by "EOF" immediately followed by "\n" and	starting from
	   the first column of the terminating line.  When searching for the
	   terminating line of a here-doc, nothing is skipped.	In other
	   words, lines	after the here-doc syntax are compared with the
	   terminating string line by line.

	   For the constructs except here-docs,	single characters are used as
	   starting and	ending delimiters.  If the starting delimiter is an
	   opening punctuation (that is	"(", "[", "{", or "<"),	the ending
	   delimiter is	the corresponding closing punctuation (that is ")",
	   "]",	"}", or	">").  If the starting delimiter is an unpaired
	   character like "/" or a closing punctuation,	the ending delimiter
	   is the same as the starting delimiter.  Therefore a "/" terminates
	   a "qq//" construct, while a "]" terminates both "qq[]" and "qq]]"
	   constructs.

	   When	searching for single-character delimiters, escaped delimiters
	   and "\\" are	skipped.  For example, while searching for terminating
	   "/",	combinations of	"\\" and "\/" are skipped.  If the delimiters
	   are bracketing, nested pairs	are also skipped.  For example,	while
	   searching for a closing "]" paired with the opening "[",
	   combinations	of "\\", "\]", and "\["	are all	skipped, and nested
	   "[" and "]" are skipped as well.  However, when backslashes are
	   used	as the delimiters (like	"qq\\" and "tr\\\"), nothing is
	   skipped.  During the	search for the end, backslashes	that escape
	   delimiters or other backslashes are removed (exactly	speaking, they
	   are not copied to the safe location).

	   For constructs with three-part delimiters ("s///", "y///", and
	   "tr///"), the search	is repeated once more.	If the first delimiter
	   is not an opening punctuation, the three delimiters must be the
	   same, such as "s!!!"	and "tr)))", in	which case the second
	   delimiter terminates	the left part and starts the right part	at
	   once.  If the left part is delimited	by bracketing punctuation
	   (that is "()", "[]",	"{}", or "<>"),	the right part needs another
	   pair	of delimiters such as "s(){}" and "tr[]//".  In	these cases,
	   whitespace and comments are allowed between the two parts, although
	   the comment must follow at least one	whitespace character;
	   otherwise a character expected as the start of the comment may be
	   regarded as the starting delimiter of the right part.

	   During this search no attention is paid to the semantics of the
	   construct.  Thus:

	       "$hash{"$foo/$bar"}"

	   or:

	       m/
		 bar	   # NOT a comment, this slash / terminated m//!
		/x

	   do not form legal quoted expressions.   The quoted part ends	on the
	   first """ and "/", and the rest happens to be a syntax error.
	   Because the slash that terminated "m//" was followed	by a "SPACE",
	   the example above is	not "m//x", but	rather "m//" with no "/x"
	   modifier.  So the embedded "#" is interpreted as a literal "#".

	   Also	no attention is	paid to	"\c\" (multichar control char syntax)
	   during this search.	Thus the second	"\" in "qq/\c\/" is
	   interpreted as a part of "\/", and the following "/"	is not
	   recognized as a delimiter.  Instead,	use "\034" or "\x1c" at	the
	   end of quoted constructs.

       Interpolation
	   The next step is interpolation in the text obtained,	which is now
	   delimiter-independent.  There are multiple cases.

	   "<<'EOF'"
	       No interpolation	is performed.  Note that the combination "\\"
	       is left intact, since escaped delimiters	are not	available for
	       here-docs.

	   "m''", the pattern of "s'''"
	       No interpolation	is performed at	this stage.  Any backslashed
	       sequences including "\\"	are treated at the stage of "Parsing
	       regular expressions".

	   '', "q//", "tr'''", "y'''", the replacement of "s'''"
	       The only	interpolation is removal of "\"	from pairs of "\\".
	       Therefore "-" in	"tr'''"	and "y'''" is treated literally	as a
	       hyphen and no character range is	available.  "\1" in the
	       replacement of "s'''" does not work as $1.

	   "tr///", "y///"
	       No variable interpolation occurs.  String modifying
	       combinations for	case and quoting such as "\Q", "\U", and "\E"
	       are not recognized.  The	other escape sequences such as "\200"
	       and "\t"	and backslashed	characters such	as "\\"	and "\-" are
	       converted to appropriate	literals.  The character "-" is
	       treated specially and therefore "\-" is treated as a literal
	       "-".

	   "", ``, "qq//", "qx//", "<file*glob>", "<<"EOF""
	       "\Q", "\U", "\u", "\L", "\l", "\F" (possibly paired with	"\E")
	       are converted to	corresponding Perl constructs.	Thus,
	       "$foo\Qbaz$bar" is converted to
	       "$foo . (quotemeta("baz"	. $bar))" internally.  The other
	       escape sequences	such as	"\200" and "\t"	and backslashed
	       characters such as "\\" and "\-"	are replaced with appropriate
	       expansions.

	       Let it be stressed that whatever	falls between "\Q" and "\E" is
	       interpolated in the usual way.  Something like "\Q\\E" has no
	       "\E" inside.  Instead, it has "\Q", "\\", and "E", so the
	       result is the same as for "\\\\E".  As a	general	rule,
	       backslashes between "\Q"	and "\E" may lead to counterintuitive
	       results.	 So, "\Q\t\E" is converted to quotemeta("\t"), which
	       is the same as "\\\t" (since TAB	is not alphanumeric).  Note
	       also that:

		   $str	= '\t';
		   return "\Q$str";

	       may be closer to	the conjectural	intention of the writer	of
	       "\Q\t\E".

	       Interpolated scalars and	arrays are converted internally	to the
	       "join" and "." catenation operations.  Thus, "$foo XXX '@arr'"
	       becomes:

		   $foo	. " XXX	'" . (join $", @arr) . "'";

	       All operations above are	performed simultaneously, left to
	       right.

	       Because the result of "\Q STRING	\E" has	all metacharacters
	       quoted, there is	no way to insert a literal "$" or "@" inside a
	       "\Q\E" pair.  If	protected by "\", "$" will be quoted to	become
	       "\\\$"; if not, it is interpreted as the	start of an
	       interpolated scalar.

	       Note also that the interpolation	code needs to make a decision
	       on where	the interpolated scalar	ends.  For instance, whether
	       "a $x ->	{c}" really means:

		   "a "	. $x . " -> {c}";

	       or:

		   "a "	. $x ->	{c};

	       Most of the time, the longest possible text that	does not
	       include spaces between components and which contains matching
	       braces or brackets.  because the	outcome	may be determined by
	       voting based on heuristic estimators, the result	is not
	       strictly	predictable.  Fortunately, it's	usually	correct	for
	       ambiguous cases.

	   The replacement of "s///"
	       Processing of "\Q", "\U", "\u", "\L", "\l", "\F"	and
	       interpolation happens as	with "qq//" constructs.

	       It is at	this step that "\1" is begrudgingly converted to $1 in
	       the replacement text of "s///", in order	to correct the
	       incorrigible sed	hackers	who haven't picked up the saner	idiom
	       yet.  A warning is emitted if the "use warnings"	pragma or the
	       -w command-line flag (that is, the $^W variable)	was set.

	   "RE"	in "m?RE?", "/RE/", "m/RE/", "s/RE/foo/",
	       Processing of "\Q", "\U", "\u", "\L", "\l", "\F", "\E", and
	       interpolation happens (almost) as with "qq//" constructs.

	       Processing of "\N{...}" is also done here, and compiled into an
	       intermediate form for the regex compiler.  (This	is because, as
	       mentioned below,	the regex compilation may be done at execution
	       time, and "\N{...}" is a	compile-time construct.)

	       However any other combinations of "\" followed by a character
	       are not substituted but only skipped, in	order to parse them as
	       regular expressions at the following step.  As "\c" is skipped
	       at this step, "@" of "\c@" in RE	is possibly treated as an
	       array symbol (for example @foo),	even though the	same text in
	       "qq//" gives interpolation of "\c@".

	       Code blocks such	as "(?{BLOCK})"	are handled by temporarily
	       passing control back to the perl	parser,	in a similar way that
	       an interpolated array subscript expression such as
	       "foo$array[1+f("[xyz")]bar" would be.

	       Moreover, inside	"(?{BLOCK})", "(?# comment )", and a
	       "#"-comment in a	"/x"-regular expression, no processing is
	       performed whatsoever.  This is the first	step at	which the
	       presence	of the "/x" modifier is	relevant.

	       Interpolation in	patterns has several quirks: $|, $(, $), "@+"
	       and "@-"	are not	interpolated, and constructs $var[SOMETHING]
	       are voted (by several different estimators) to be either	an
	       array element or	$var followed by an RE alternative.  This is
	       where the notation "${arr[$bar]}" comes handy: "/${arr[0-9]}/"
	       is interpreted as array element -9, not as a regular expression
	       from the	variable $arr followed by a digit, which would be the
	       interpretation of "/$arr[0-9]/".	 Since voting among different
	       estimators may occur, the result	is not predictable.

	       The lack	of processing of "\\" creates specific restrictions on
	       the post-processed text.	 If the	delimiter is "/", one cannot
	       get the combination "\/"	into the result	of this	step.  "/"
	       will finish the regular expression, "\/"	will be	stripped to
	       "/" on the previous step, and "\\/" will	be left	as is.
	       Because "/" is equivalent to "\/" inside	a regular expression,
	       this does not matter unless the delimiter happens to be
	       character special to the	RE engine, such	as in "s*foo*bar*",
	       "m[foo]", or "m?foo?"; or an alphanumeric char, as in:

		   m m ^ a \s* b mmx;

	       In the RE above,	which is intentionally obfuscated for
	       illustration, the delimiter is "m", the modifier	is "mx", and
	       after delimiter-removal the RE is the same as for
	       "m/ ^ a \s* b /mx".  There's more than one reason you're
	       encouraged to restrict your delimiters to non-alphanumeric,
	       non-whitespace choices.

	   This	step is	the last one for all constructs	except regular
	   expressions,	which are processed further.

       Parsing regular expressions
	   Previous steps were performed during	the compilation	of Perl	code,
	   but this one	happens	at run time, although it may be	optimized to
	   be calculated at compile time if appropriate.  After	preprocessing
	   described above, and	possibly after evaluation if concatenation,
	   joining, casing translation,	or metaquoting are involved, the
	   resulting string is passed to the RE	engine for compilation.

	   Whatever happens in the RE engine might be better discussed in
	   perlre, but for the sake of continuity, we shall do so here.

	   This	is another step	where the presence of the "/x" modifier	is
	   relevant.  The RE engine scans the string from left to right	and
	   converts it into a finite automaton.

	   Backslashed characters are either replaced with corresponding
	   literal strings (as with "\{"), or else they	generate special nodes
	   in the finite automaton (as with "\b").  Characters special to the
	   RE engine (such as "|") generate corresponding nodes	or groups of
	   nodes.  "(?#...)" comments are ignored.  All	the rest is either
	   converted to	literal	strings	to match, or else is ignored (as is
	   whitespace and "#"-style comments if	"/x" is	present).

	   Parsing of the bracketed character class construct, "[...]",	is
	   rather different than the rule used for the rest of the pattern.
	   The terminator of this construct is found using the same rules as
	   for finding the terminator of a "{}"-delimited construct, the only
	   exception being that	"]" immediately	following "[" is treated as
	   though preceded by a	backslash.

	   The terminator of runtime "(?{...})"	is found by temporarily
	   switching control to	the perl parser, which should stop at the
	   point where the logically balancing terminating "}" is found.

	   It is possible to inspect both the string given to RE engine	and
	   the resulting finite	automaton.  See	the arguments
	   "debug"/"debugcolor"	in the "use re"	pragma,	as well	as Perl's -Dr
	   command-line	switch documented in "Command Switches"	in perlrun.

       Optimization of regular expressions
	   This	step is	listed for completeness	only.  Since it	does not
	   change semantics, details of	this step are not documented and are
	   subject to change without notice.  This step	is performed over the
	   finite automaton that was generated during the previous pass.

	   It is at this stage that split() silently optimizes "/^/" to	mean
	   "/^/m".

   I/O Operators
       There are several I/O operators you should know about.

       A string	enclosed by backticks (grave accents) first undergoes
       double-quote interpolation.  It is then interpreted as an external
       command,	and the	output of that command is the value of the backtick
       string, like in a shell.	 In scalar context, a single string consisting
       of all output is	returned.  In list context, a list of values is
       returned, one per line of output.  (You can set $/ to use a different
       line terminator.)  The command is executed each time the	pseudo-literal
       is evaluated.  The status value of the command is returned in $?	(see
       perlvar for the interpretation of $?).  Unlike in csh, no translation
       is done on the return data--newlines remain newlines.  Unlike in	any of
       the shells, single quotes do not	hide variable names in the command
       from interpretation.  To	pass a literal dollar-sign through to the
       shell you need to hide it with a	backslash.  The	generalized form of
       backticks is "qx//", or you can call the	"readpipe" in perlfunc
       function.  (Because backticks always undergo shell expansion as well,
       see perlsec for security	concerns.)

       In scalar context, evaluating a filehandle in angle brackets yields the
       next line from that file	(the newline, if any, included), or "undef" at
       end-of-file or on error.	 When $/ is set	to "undef" (sometimes known as
       file-slurp mode)	and the	file is	empty, it returns '' the first time,
       followed	by "undef" subsequently.

       Ordinarily you must assign the returned value to	a variable, but	there
       is one situation	where an automatic assignment happens.	If and only if
       the input symbol	is the only thing inside the conditional of a "while"
       statement (even if disguised as a for(;;) loop),	the value is
       automatically assigned to the global variable $_, destroying whatever
       was there previously.  (This may	seem like an odd thing to you, but
       you'll use the construct	in almost every	Perl script you	write.)	 The
       $_ variable is not implicitly localized.	 You'll	have to	put a
       "local $_;" before the loop if you want that to happen.	Furthermore,
       if the input symbol or an explicit assignment of	the input symbol to a
       scalar is used as a "while"/"for" condition, then the condition
       actually	tests for definedness of the expression's value, not for its
       regular truth value.

       Thus the	following lines	are equivalent:

	   while (defined($_ = <STDIN>)) { print; }
	   while ($_ = <STDIN>)	{ print; }
	   while (<STDIN>) { print; }
	   for (;<STDIN>;) { print; }
	   print while defined($_ = <STDIN>);
	   print while ($_ = <STDIN>);
	   print while <STDIN>;

       This also behaves similarly, but	assigns	to a lexical variable instead
       of to $_:

	   while (my $line = <STDIN>) {	print $line }

       In these	loop constructs, the assigned value (whether assignment	is
       automatic or explicit) is then tested to	see whether it is defined.
       The defined test	avoids problems	where the line has a string value that
       would be	treated	as false by Perl; for example a	"" or a	"0" with no
       trailing	newline.  If you really	mean for such values to	terminate the
       loop, they should be tested for explicitly:

	   while (($_ =	<STDIN>) ne '0') { ... }
	   while (<STDIN>) { last unless $_; ... }

       In other	boolean	contexts, "<FILEHANDLE>" without an explicit "defined"
       test or comparison elicits a warning if the "use	warnings" pragma or
       the -w command-line switch (the $^W variable) is	in effect.

       The filehandles STDIN, STDOUT, and STDERR are predefined.  (The
       filehandles "stdin", "stdout", and "stderr" will	also work except in
       packages, where they would be interpreted as local identifiers rather
       than global.)  Additional filehandles may be created with the open()
       function, amongst others.  See perlopentut and "open" in	perlfunc for
       details on this.

       If a "<FILEHANDLE>" is used in a	context	that is	looking	for a list, a
       list comprising all input lines is returned, one	line per list element.
       It's easy to grow to a rather large data	space this way,	so use with
       care.

       "<FILEHANDLE>"  may also	be spelled readline(*FILEHANDLE).  See
       "readline" in perlfunc.

       The null	filehandle "<>"	(sometimes called the diamond operator)	is
       special:	it can be used to emulate the behavior of sed and awk, and any
       other Unix filter program that takes a list of filenames, doing the
       same to each line of input from all of them.  Input from	"<>" comes
       either from standard input, or from each	file listed on the command
       line.  Here's how it works: the first time "<>" is evaluated, the @ARGV
       array is	checked, and if	it is empty, $ARGV[0] is set to	"-", which
       when opened gives you standard input.  The @ARGV	array is then
       processed as a list of filenames.  The loop

	   while (<>) {
	       ...		       # code for each line
	   }

       is equivalent to	the following Perl-like	pseudo code:

	   unshift(@ARGV, '-') unless @ARGV;
	   while ($ARGV	= shift) {
	       open(ARGV, $ARGV);
	       while (<ARGV>) {
		   ...	       # code for each line
	       }
	   }

       except that it isn't so cumbersome to say, and will actually work.  It
       really does shift the @ARGV array and put the current filename into the
       $ARGV variable.	It also	uses filehandle	ARGV internally.  "<>" is just
       a synonym for "<ARGV>", which is	magical.  (The pseudo code above
       doesn't work because it treats "<ARGV>" as non-magical.)

       Since the null filehandle uses the two argument form of "open" in
       perlfunc	it interprets special characters, so if	you have a script like
       this:

	   while (<>) {
	       print;
	   }

       and call	it with	"perl dangerous.pl 'rm -rfv *|'", it actually opens a
       pipe, executes the "rm" command and reads "rm"'s	output from that pipe.
       If you want all items in	@ARGV to be interpreted	as file	names, you can
       use the module "ARGV::readonly" from CPAN, or use the double diamond
       operator:

	   while (<<>>)	{
	       print;
	   }

       Using double angle brackets inside of a while causes the	open to	use
       the three argument form (with the second	argument being "<"), so	all
       arguments in "ARGV" are treated as literal filenames (including "-").
       (Note that for convenience, if you use "<<>>" and if @ARGV is empty, it
       will still read from the	standard input.)

       You can modify @ARGV before the first "<>" as long as the array ends up
       containing the list of filenames	you really want.  Line numbers ($.)
       continue	as though the input were one big happy file.  See the example
       in "eof"	in perlfunc for	how to reset line numbers on each file.

       If you want to set @ARGV	to your	own list of files, go right ahead.
       This sets @ARGV to all plain text files if no @ARGV was given:

	   @ARGV = grep	{ -f &&	-T } glob('*') unless @ARGV;

       You can even set	them to	pipe commands.	For example, this
       automatically filters compressed	arguments through gzip:

	   @ARGV = map { /\.(gz|Z)$/ ? "gzip -dc < $_ |" : $_ }	@ARGV;

       If you want to pass switches into your script, you can use one of the
       "Getopts" modules or put	a loop on the front like this:

	   while ($_ = $ARGV[0], /^-/) {
	       shift;
	       last if /^--$/;
	       if (/^-D(.*)/) {	$debug = $1 }
	       if (/^-v/)     {	$verbose++  }
	       # ...	       # other switches
	   }

	   while (<>) {
	       # ...	       # code for each line
	   }

       The "<>"	symbol will return "undef" for end-of-file only	once.  If you
       call it again after this, it will assume	you are	processing another
       @ARGV list, and if you haven't set @ARGV, will read input from STDIN.

       If what the angle brackets contain is a simple scalar variable (for
       example,	$foo), then that variable contains the name of the filehandle
       to input	from, or its typeglob, or a reference to the same.  For
       example:

	   $fh = \*STDIN;
	   $line = <$fh>;

       If what's within	the angle brackets is neither a	filehandle nor a
       simple scalar variable containing a filehandle name, typeglob, or
       typeglob	reference, it is interpreted as	a filename pattern to be
       globbed,	and either a list of filenames or the next filename in the
       list is returned, depending on context.	This distinction is determined
       on syntactic grounds alone.  That means "<$x>" is always	a readline()
       from an indirect	handle,	but "<$hash{key}>" is always a glob().	That's
       because $x is a simple scalar variable, but $hash{key} is not--it's a
       hash element.  Even "<$x	>" (note the extra space) is treated as
       "glob("$x ")", not readline($x).

       One level of double-quote interpretation	is done	first, but you can't
       say "<$foo>" because that's an indirect filehandle as explained in the
       previous	paragraph.  (In	older versions of Perl,	programmers would
       insert curly brackets to	force interpretation as	a filename glob:
       "<${foo}>".  These days,	it's considered	cleaner	to call	the internal
       function	directly as glob($foo),	which is probably the right way	to
       have done it in the first place.)  For example:

	   while (<*.c>) {
	       chmod 0644, $_;
	   }

       is roughly equivalent to:

	   open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|");
	   while (<FOO>) {
	       chomp;
	       chmod 0644, $_;
	   }

       except that the globbing	is actually done internally using the standard
       "File::Glob" extension.	Of course, the shortest	way to do the above
       is:

	   chmod 0644, <*.c>;

       A (file)glob evaluates its (embedded) argument only when	it is starting
       a new list.  All	values must be read before it will start over.	In
       list context, this isn't	important because you automatically get	them
       all anyway.  However, in	scalar context the operator returns the	next
       value each time it's called, or "undef" when the	list has run out.  As
       with filehandle reads, an automatic "defined" is	generated when the
       glob occurs in the test part of a "while", because legal	glob returns
       (for example, a file called 0) would otherwise terminate	the loop.
       Again, "undef" is returned only once.  So if you're expecting a single
       value from a glob, it is	much better to say

	   ($file) = <blurch*>;

       than

	   $file = <blurch*>;

       because the latter will alternate between returning a filename and
       returning false.

       If you're trying	to do variable interpolation, it's definitely better
       to use the glob() function, because the older notation can cause	people
       to become confused with the indirect filehandle notation.

	   @files = glob("$dir/*.[ch]");
	   @files = glob($files[$i]);

       If an angle-bracket-based globbing expression is	used as	the condition
       of a "while" or "for" loop, then	it will	be implicitly assigned to $_.
       If either a globbing expression or an explicit assignment of a globbing
       expression to a scalar is used as a "while"/"for" condition, then the
       condition actually tests	for definedness	of the expression's value, not
       for its regular truth value.

   Constant Folding
       Like C, Perl does a certain amount of expression	evaluation at compile
       time whenever it	determines that	all arguments to an operator are
       static and have no side effects.	 In particular,	string concatenation
       happens at compile time between literals	that don't do variable
       substitution.  Backslash	interpolation also happens at compile time.
       You can say

	     'Now is the time for all'
	   . "\n"
	   .  'good men	to come	to.'

       and this	all reduces to one string internally.  Likewise, if you	say

	   foreach $file (@filenames) {
	       if (-s $file > 5	+ 100 *	2**16) {  }
	   }

       the compiler precomputes	the number which that expression represents so
       that the	interpreter won't have to.

   No-ops
       Perl doesn't officially have a no-op operator, but the bare constants 0
       and 1 are special-cased not to produce a	warning	in void	context, so
       you can for example safely do

	   1 while foo();

   Bitwise String Operators
       Bitstrings of any size may be manipulated by the	bitwise	operators ("~
       | & ^").

       If the operands to a binary bitwise op are strings of different sizes,
       | and ^ ops act as though the shorter operand had additional zero bits
       on the right, while the & op acts as though the longer operand was
       truncated to the	length of the shorter.	The granularity	for such
       extension or truncation is one or more bytes.

	   # ASCII-based examples
	   print "j p \n" ^ " a	h";	       # prints	"JAPH\n"
	   print "JA" |	"  ph\n";	       # prints	"japh\n"
	   print "japh\nJunk" &	'_____';       # prints	"JAPH\n";
	   print 'p N$'	^ " E<H\n";	       # prints	"Perl\n";

       If you are intending to manipulate bitstrings, be certain that you're
       supplying bitstrings: If	an operand is a	number,	that will imply	a
       numeric bitwise operation.  You may explicitly show which type of
       operation you intend by using ""	or "0+", as in the examples below.

	   $foo	=  150	|  105;	       # yields	255  (0x96 | 0x69 is 0xFF)
	   $foo	= '150'	|  105;	       # yields	255
	   $foo	=  150	| '105';       # yields	255
	   $foo	= '150'	| '105';       # yields	string '155' (under ASCII)

	   $baz	= 0+$foo & 0+$bar;     # both ops explicitly numeric
	   $biz	= "$foo" ^ "$bar";     # both ops explicitly stringy

       This somewhat unpredictable behavior can	be avoided with	the "bitwise"
       feature,	new in Perl 5.22.  You can enable it via use feature 'bitwise'
       or "use v5.28".	Before Perl 5.28, it used to emit a warning in the
       "experimental::bitwise" category.  Under	this feature, the four
       standard	bitwise	operators ("~ |	& ^") are always numeric.  Adding a
       dot after each operator ("~. |. &. ^.") forces it to treat its operands
       as strings:

	   use feature "bitwise";
	   $foo	=  150	|  105;	       # yields	255  (0x96 | 0x69 is 0xFF)
	   $foo	= '150'	|  105;	       # yields	255
	   $foo	=  150	| '105';       # yields	255
	   $foo	= '150'	| '105';       # yields	255
	   $foo	=  150	|. 105;	       # yields	string '155'
	   $foo	= '150'	|. 105;	       # yields	string '155'
	   $foo	=  150	|.'105';       # yields	string '155'
	   $foo	= '150'	|.'105';       # yields	string '155'

	   $baz	= $foo &  $bar;	       # both operands numeric
	   $biz	= $foo ^. $bar;	       # both operands stringy

       The assignment variants of these	operators ("&= |= ^= &.= |.= ^.=")
       behave likewise under the feature.

       It is a fatal error if an operand contains a character whose ordinal
       value is	above 0xFF, and	hence not expressible except in	UTF-8.	The
       operation is performed on a non-UTF-8 copy for other operands encoded
       in UTF-8.  See "Byte and	Character Semantics" in	perlunicode.

       See "vec" in perlfunc for information on	how to manipulate individual
       bits in a bit vector.

   Integer Arithmetic
       By default, Perl	assumes	that it	must do	most of	its arithmetic in
       floating	point.	But by saying

	   use integer;

       you may tell the	compiler to use	integer	operations (see	integer	for a
       detailed	explanation) from here to the end of the enclosing BLOCK.  An
       inner BLOCK may countermand this	by saying

	   no integer;

       which lasts until the end of that BLOCK.	 Note that this	doesn't	mean
       everything is an	integer, merely	that Perl will use integer operations
       for arithmetic, comparison, and bitwise operators.  For example,	even
       under "use integer", if you take	the sqrt(2), you'll still get
       1.4142135623731 or so.

       Used on numbers,	the bitwise operators ("&" "|" "^" "~" "<<" ">>")
       always produce integral results.	 (But see also "Bitwise	String
       Operators".)  However, "use integer" still has meaning for them.	 By
       default,	their results are interpreted as unsigned integers, but	if
       "use integer" is	in effect, their results are interpreted as signed
       integers.  For example, "~0" usually evaluates to a large integral
       value.  However,	"use integer; ~0" is -1	on two's-complement machines.

   Floating-point Arithmetic
       While "use integer" provides integer-only arithmetic, there is no
       analogous mechanism to provide automatic	rounding or truncation to a
       certain number of decimal places.  For rounding to a certain number of
       digits, sprintf() or printf() is	usually	the easiest route.  See
       perlfaq4.

       Floating-point numbers are only approximations to what a	mathematician
       would call real numbers.	 There are infinitely more reals than floats,
       so some corners must be cut.  For example:

	   printf "%.20g\n", 123456789123456789;
	   #	    produces 123456789123456784

       Testing for exact floating-point	equality or inequality is not a	good
       idea.  Here's a (relatively expensive) work-around to compare whether
       two floating-point numbers are equal to a particular number of decimal
       places.	See Knuth, volume II, for a more robust	treatment of this
       topic.

	   sub fp_equal	{
	       my ($X, $Y, $POINTS) = @_;
	       my ($tX,	$tY);
	       $tX = sprintf("%.${POINTS}g", $X);
	       $tY = sprintf("%.${POINTS}g", $Y);
	       return $tX eq $tY;
	   }

       The POSIX module	(part of the standard perl distribution) implements
       ceil(), floor(),	and other mathematical and trigonometric functions.
       The "Math::Complex" module (part	of the standard	perl distribution)
       defines mathematical functions that work	on both	the reals and the
       imaginary numbers.  "Math::Complex" is not as efficient as POSIX, but
       POSIX can't work	with complex numbers.

       Rounding	in financial applications can have serious implications, and
       the rounding method used	should be specified precisely.	In these
       cases, it probably pays not to trust whichever system rounding is being
       used by Perl, but to instead implement the rounding function you	need
       yourself.

   Bigger Numbers
       The standard "Math::BigInt", "Math::BigRat", and	"Math::BigFloat"
       modules,	along with the "bignum", "bigint", and "bigrat"	pragmas,
       provide variable-precision arithmetic and overloaded operators,
       although	they're	currently pretty slow.	At the cost of some space and
       considerable speed, they	avoid the normal pitfalls associated with
       limited-precision representations.

	   use 5.010;
	   use bigint;	# easy interface to Math::BigInt
	   $x =	123456789123456789;
	   say $x * $x;
	   +15241578780673678515622620750190521

       Or with rationals:

	   use 5.010;
	   use bigrat;
	   $x =	3/22;
	   $y =	4/6;
	   say "x/y is ", $x/$y;
	   say "x*y is ", $x*$y;
	   x/y is 9/44
	   x*y is 1/11

       Several modules let you calculate with unlimited	or fixed precision
       (bound only by memory and CPU time).  There are also some non-standard
       modules that provide faster implementations via external	C libraries.

       Here is a short,	but incomplete summary:

	   Math::String		  treat	string sequences like numbers
	   Math::FixedPrecision	  calculate with a fixed precision
	   Math::Currency	  for currency calculations
	   Bit::Vector		  manipulate bit vectors fast (uses C)
	   Math::BigIntFast	  Bit::Vector wrapper for big numbers
	   Math::Pari		  provides access to the Pari C	library
	   Math::Cephes		  uses the external Cephes C library (no
				  big numbers)
	   Math::Cephes::Fraction fractions via	the Cephes library
	   Math::GMP		  another one using an external	C library
	   Math::GMPz		  an alternative interface to libgmp's big ints
	   Math::GMPq		  an interface to libgmp's fraction numbers
	   Math::GMPf		  an interface to libgmp's floating point numbers

       Choose wisely.

   C-style Logical Or
       This section has	been superceded	by "C-style Logical Or,	Xor, and
       Defined Or".  The heading is retained only to prevent breaking any
       pre-existing links to it	from outside.

   C-style Logical Xor
       This section has	been superceded	by "C-style Logical Or,	Xor, and
       Defined Or".  The heading is retained only to prevent breaking any
       pre-existing links to it	from outside.

   Logical Defined-Or
       This section has	been superceded	by "C-style Logical Or,	Xor, and
       Defined Or".  The heading is retained only to prevent breaking any
       pre-existing links to it	from outside.

   Quote-Like Operators
       This section has	been replaced by "Simpler Quote-Like Operators"

   Indented Here-docs
       This section has	been merged into "Here-docs"

APPENDIX
   List	of Extra Paired	Delimiters
       The complete list of accepted paired delimiters as of Unicode 16.0 is:

	(  )	U+0028,	U+0029	 LEFT/RIGHT PARENTHESIS
	<  >	U+003C,	U+003E	 LESS-THAN/GREATER-THAN	SIGN
	[  ]	U+005B,	U+005D	 LEFT/RIGHT SQUARE BRACKET
	{  }	U+007B,	U+007D	 LEFT/RIGHT CURLY BRACKET
	      U+00AB, U+00BB   LEFT/RIGHT-POINTING DOUBLE ANGLE	QUOTATION MARK
	      U+00BB, U+00AB   RIGHT/LEFT-POINTING DOUBLE ANGLE	QUOTATION MARK
	      U+0F3A, U+0F3B   TIBETAN MARK GUG	RTAGS GYON,  TIBETAN MARK GUG
				 RTAGS GYAS
	      U+0F3C, U+0F3D   TIBETAN MARK ANG	KHANG GYON,  TIBETAN MARK ANG
				 KHANG GYAS
	      U+169B, U+169C   OGHAM FEATHER MARK,  OGHAM REVERSED FEATHER MARK
	      U+2018, U+2019   LEFT/RIGHT SINGLE QUOTATION MARK
	      U+2019, U+2018   RIGHT/LEFT SINGLE QUOTATION MARK
	      U+201C, U+201D   LEFT/RIGHT DOUBLE QUOTATION MARK
	      U+201D, U+201C   RIGHT/LEFT DOUBLE QUOTATION MARK
	      U+2035, U+2032   REVERSED	PRIME,	PRIME
	      U+2036, U+2033   REVERSED	DOUBLE PRIME,  DOUBLE PRIME
	      U+2037, U+2034   REVERSED	TRIPLE PRIME,  TRIPLE PRIME
	      U+2039, U+203A   SINGLE LEFT/RIGHT-POINTING ANGLE	QUOTATION MARK
	      U+203A, U+2039   SINGLE RIGHT/LEFT-POINTING ANGLE	QUOTATION MARK
	      U+2045, U+2046   LEFT/RIGHT SQUARE BRACKET WITH QUILL
	      U+204D, U+204C   BLACK RIGHT/LEFTWARDS BULLET
	      U+207D, U+207E   SUPERSCRIPT LEFT/RIGHT PARENTHESIS
	      U+208D, U+208E   SUBSCRIPT LEFT/RIGHT PARENTHESIS
	      U+2192, U+2190   RIGHT/LEFTWARDS ARROW
	      U+219B, U+219A   RIGHT/LEFTWARDS ARROW WITH STROKE
	      U+219D, U+219C   RIGHT/LEFTWARDS WAVE ARROW
	       U+21A0, U+219E	RIGHT/LEFTWARDS	TWO HEADED ARROW
	      U+21A3, U+21A2   RIGHT/LEFTWARDS ARROW WITH TAIL
	      U+21A6, U+21A4   RIGHT/LEFTWARDS ARROW FROM BAR
	      U+21AA, U+21A9   RIGHT/LEFTWARDS ARROW WITH HOOK
	      U+21AC, U+21AB   RIGHT/LEFTWARDS ARROW WITH LOOP
	      U+21B1, U+21B0   UPWARDS ARROW WITH TIP RIGHT/LEFTWARDS
	      U+21B3, U+21B2   DOWNWARDS ARROW WITH TIP	RIGHT/LEFTWARDS
	      U+21C0, U+21BC   RIGHT/LEFTWARDS HARPOON WITH BARB UPWARDS
	      U+21C1, U+21BD   RIGHT/LEFTWARDS HARPOON WITH BARB DOWNWARDS
	      U+21C9, U+21C7   RIGHT/LEFTWARDS PAIRED ARROWS
	      U+21CF, U+21CD   RIGHT/LEFTWARDS DOUBLE ARROW WITH STROKE
	      U+21D2, U+21D0   RIGHT/LEFTWARDS DOUBLE ARROW
	      U+21DB, U+21DA   RIGHT/LEFTWARDS TRIPLE ARROW
	      U+21DD, U+21DC   RIGHT/LEFTWARDS SQUIGGLE	ARROW
	       U+21E2, U+21E0	RIGHT/LEFTWARDS	DASHED ARROW
	      U+21E5, U+21E4   RIGHT/LEFTWARDS ARROW TO	BAR
	      U+21E8, U+21E6   RIGHT/LEFTWARDS WHITE ARROW
	      U+21F4, U+2B30   RIGHT/LEFT ARROW	WITH SMALL CIRCLE
	      U+21F6, U+2B31   THREE RIGHT/LEFTWARDS ARROWS
	      U+21F8, U+21F7   RIGHT/LEFTWARDS ARROW WITH VERTICAL STROKE
	      U+21FB, U+21FA   RIGHT/LEFTWARDS ARROW WITH DOUBLE VERTICAL
				 STROKE
	      U+21FE, U+21FD   RIGHT/LEFTWARDS OPEN-HEADED ARROW
	      U+2208, U+220B   ELEMENT OF,  CONTAINS AS	MEMBER
	      U+2209, U+220C   NOT AN ELEMENT OF,  DOES	NOT CONTAIN AS MEMBER
	      U+220A, U+220D   SMALL ELEMENT OF,  SMALL	CONTAINS AS MEMBER
	      U+2264, U+2265   LESS-THAN/GREATER-THAN OR EQUAL TO
	      U+2266, U+2267   LESS-THAN/GREATER-THAN OVER EQUAL TO
	      U+2268, U+2269   LESS-THAN/GREATER-THAN BUT NOT EQUAL TO
	      U+226A, U+226B   MUCH LESS-THAN/GREATER-THAN
	      U+226E, U+226F   NOT LESS-THAN/GREATER-THAN
	      U+2270, U+2271   NEITHER LESS-THAN/GREATER-THAN NOR EQUAL	TO
	      U+2272, U+2273   LESS-THAN/GREATER-THAN OR EQUIVALENT TO
	      U+2274, U+2275   NEITHER LESS-THAN/GREATER-THAN NOR EQUIVALENT TO
	      U+227A, U+227B   PRECEDES/SUCCEEDS
	      U+227C, U+227D   PRECEDES/SUCCEEDS OR EQUAL TO
	      U+227E, U+227F   PRECEDES/SUCCEEDS OR EQUIVALENT TO
	      U+2280, U+2281   DOES NOT	PRECEDE/SUCCEED
	      U+2282, U+2283   SUBSET/SUPERSET OF
	      U+2284, U+2285   NOT A SUBSET/SUPERSET OF
	      U+2286, U+2287   SUBSET/SUPERSET OF OR EQUAL TO
	      U+2288, U+2289   NEITHER A SUBSET/SUPERSET OF NOR	EQUAL TO
	      U+228A, U+228B   SUBSET/SUPERSET OF WITH NOT EQUAL TO
	      U+22A3, U+22A2   LEFT/RIGHT TACK
	      U+22A6, U+2ADE   ASSERTION,  SHORT LEFT TACK
	      U+22A8, U+2AE4   TRUE,  VERTICAL BAR DOUBLE LEFT TURNSTILE
	      U+22A9, U+2AE3   FORCES,	DOUBLE VERTICAL	BAR LEFT TURNSTILE
	      U+22B0, U+22B1   PRECEDES/SUCCEEDS UNDER RELATION
	      U+22D0, U+22D1   DOUBLE SUBSET/SUPERSET
	      U+22D6, U+22D7   LESS-THAN/GREATER-THAN WITH DOT
	      U+22D8, U+22D9   VERY MUCH LESS-THAN/GREATER-THAN
	      U+22DC, U+22DD   EQUAL TO	OR LESS-THAN/GREATER-THAN
	      U+22DE, U+22DF   EQUAL TO	OR PRECEDES/SUCCEEDS
	       U+22E0, U+22E1	DOES NOT PRECEDE/SUCCEED OR EQUAL
	      U+22E6, U+22E7   LESS-THAN/GREATER-THAN BUT NOT EQUIVALENT TO
	      U+22E8, U+22E9   PRECEDES/SUCCEEDS BUT NOT EQUIVALENT TO
	      U+22F2, U+22FA   ELEMENT OF/CONTAINS WITH	LONG HORIZONTAL	STROKE
	      U+22F3, U+22FB   ELEMENT OF/CONTAINS WITH	VERTICAL BAR AT	END OF
				 HORIZONTAL STROKE
	      U+22F4, U+22FC   SMALL ELEMENT OF/CONTAINS WITH VERTICAL BAR AT
				 END OF	HORIZONTAL STROKE
	      U+22F6, U+22FD   ELEMENT OF/CONTAINS WITH	OVERBAR
	      U+22F7, U+22FE   SMALL ELEMENT OF/CONTAINS WITH OVERBAR
	      U+2308, U+2309   LEFT/RIGHT CEILING
	      U+230A, U+230B   LEFT/RIGHT FLOOR
	      U+2326, U+232B   ERASE TO	THE RIGHT/LEFT
	    U+2329, U+232A   LEFT/RIGHT-POINTING ANGLE BRACKET
	      U+2348, U+2347   APL FUNCTIONAL SYMBOL QUAD RIGHT/LEFTWARDS ARROW
	    U+23E9, U+23EA   BLACK RIGHT/LEFT-POINTING DOUBLE TRIANGLE
	      U+23ED, U+23EE   BLACK RIGHT/LEFT-POINTING DOUBLE	TRIANGLE WITH
				 VERTICAL BAR
	      U+261B, U+261A   BLACK RIGHT/LEFT	POINTING INDEX
	      U+261E, U+261C   WHITE RIGHT/LEFT	POINTING INDEX
	      U+269E, U+269F   THREE LINES CONVERGING RIGHT/LEFT
	      U+2768, U+2769   MEDIUM LEFT/RIGHT PARENTHESIS ORNAMENT
	      U+276A, U+276B   MEDIUM FLATTENED	LEFT/RIGHT PARENTHESIS ORNAMENT
	      U+276C, U+276D   MEDIUM LEFT/RIGHT-POINTING ANGLE	BRACKET
				 ORNAMENT
	      U+276E, U+276F   HEAVY LEFT/RIGHT-POINTING ANGLE QUOTATION MARK
				 ORNAMENT
	      U+2770, U+2771   HEAVY LEFT/RIGHT-POINTING ANGLE BRACKET ORNAMENT
	      U+2772, U+2773   LIGHT LEFT/RIGHT	TORTOISE SHELL BRACKET ORNAMENT
	      U+2774, U+2775   MEDIUM LEFT/RIGHT CURLY BRACKET ORNAMENT
	      U+27C3, U+27C4   OPEN SUBSET/SUPERSET
	      U+27C5, U+27C6   LEFT/RIGHT S-SHAPED BAG DELIMITER
	      U+27C8, U+27C9   REVERSE SOLIDUS PRECEDING SUBSET,  SUPERSET
				 PRECEDING SOLIDUS
	      U+27DE, U+27DD   LONG LEFT/RIGHT TACK
	      U+27E6, U+27E7   MATHEMATICAL LEFT/RIGHT WHITE SQUARE BRACKET
	      U+27E8, U+27E9   MATHEMATICAL LEFT/RIGHT ANGLE BRACKET
	      U+27EA, U+27EB   MATHEMATICAL LEFT/RIGHT DOUBLE ANGLE BRACKET
	      U+27EC, U+27ED   MATHEMATICAL LEFT/RIGHT WHITE TORTOISE SHELL
				 BRACKET
	      U+27EE, U+27EF   MATHEMATICAL LEFT/RIGHT FLATTENED PARENTHESIS
	      U+27F4, U+2B32   RIGHT/LEFT ARROW	WITH CIRCLED PLUS
	      U+27F6, U+27F5   LONG RIGHT/LEFTWARDS ARROW
	      U+27F9, U+27F8   LONG RIGHT/LEFTWARDS DOUBLE ARROW
	      U+27FC, U+27FB   LONG RIGHT/LEFTWARDS ARROW FROM BAR
	      U+27FE, U+27FD   LONG RIGHT/LEFTWARDS DOUBLE ARROW FROM BAR
	      U+27FF, U+2B33   LONG RIGHT/LEFTWARDS SQUIGGLE ARROW
	      U+2900, U+2B34   RIGHT/LEFTWARDS TWO-HEADED ARROW	WITH VERTICAL
				 STROKE
	      U+2901, U+2B35   RIGHT/LEFTWARDS TWO-HEADED ARROW	WITH DOUBLE
				 VERTICAL STROKE
	      U+2903, U+2902   RIGHT/LEFTWARDS DOUBLE ARROW WITH VERTICAL
				 STROKE
	      U+2905, U+2B36   RIGHT/LEFTWARDS TWO-HEADED ARROW	FROM BAR
	      U+2907, U+2906   RIGHT/LEFTWARDS DOUBLE ARROW FROM BAR
	      U+290D, U+290C   RIGHT/LEFTWARDS DOUBLE DASH ARROW
	      U+290F, U+290E   RIGHT/LEFTWARDS TRIPLE DASH ARROW
	      U+2910, U+2B37   RIGHT/LEFTWARDS TWO-HEADED TRIPLE DASH ARROW
	      U+2911, U+2B38   RIGHT/LEFTWARDS ARROW WITH DOTTED STEM
	      U+2914, U+2B39   RIGHT/LEFTWARDS ARROW WITH TAIL WITH VERTICAL
				 STROKE
	      U+2915, U+2B3A   RIGHT/LEFTWARDS ARROW WITH TAIL WITH DOUBLE
				 VERTICAL STROKE
	      U+2916, U+2B3B   RIGHT/LEFTWARDS TWO-HEADED ARROW	WITH TAIL
	      U+2917, U+2B3C   RIGHT/LEFTWARDS TWO-HEADED ARROW	WITH TAIL WITH
				 VERTICAL STROKE
	      U+2918, U+2B3D   RIGHT/LEFTWARDS TWO-HEADED ARROW	WITH TAIL WITH
				 DOUBLE	VERTICAL STROKE
	      U+291A, U+2919   RIGHT/LEFTWARDS ARROW-TAIL
	      U+291C, U+291B   RIGHT/LEFTWARDS DOUBLE ARROW-TAIL
	      U+291E, U+291D   RIGHT/LEFTWARDS ARROW TO	BLACK DIAMOND
	       U+2920, U+291F	RIGHT/LEFTWARDS	ARROW FROM BAR TO BLACK	DIAMOND
	      U+2933, U+2B3F   WAVE ARROW POINTING DIRECTLY RIGHT/LEFT
	      U+2937, U+2936   ARROW POINTING DOWNWARDS	THEN CURVING RIGHT/
				 LEFTWARDS
	      U+2945, U+2946   RIGHT/LEFTWARDS ARROW WITH PLUS BELOW
	      U+2947, U+2B3E   RIGHT/LEFTWARDS ARROW THROUGH X
	      U+2953, U+2952   RIGHT/LEFTWARDS HARPOON WITH BARB UP TO BAR
	      U+2957, U+2956   RIGHT/LEFTWARDS HARPOON WITH BARB DOWN TO BAR
	      U+295B, U+295A   RIGHT/LEFTWARDS HARPOON WITH BARB UP FROM BAR
	      U+295F, U+295E   RIGHT/LEFTWARDS HARPOON WITH BARB DOWN FROM BAR
	      U+2964, U+2962   RIGHT/LEFTWARDS HARPOON WITH BARB UP ABOVE
				 RIGHT/LEFTWARDS HARPOON WITH BARB DOWN
	      U+296C, U+296A   RIGHT/LEFTWARDS HARPOON WITH BARB UP ABOVE LONG
				 DASH
	      U+296D, U+296B   RIGHT/LEFTWARDS HARPOON WITH BARB DOWN BELOW
				 LONG DASH
	      U+2971, U+2B40   EQUALS SIGN ABOVE RIGHT/LEFTWARDS ARROW
	      U+2972, U+2B41   TILDE OPERATOR ABOVE RIGHTWARDS ARROW,  REVERSE
				 TILDE OPERATOR	ABOVE LEFTWARDS	ARROW
	      U+2974, U+2B4B   RIGHTWARDS ARROW	ABOVE TILDE OPERATOR,
				 LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
	      U+2975, U+2B42   RIGHTWARDS ARROW	ABOVE ALMOST EQUAL TO,
				 LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO
	      U+2979, U+297B   SUBSET/SUPERSET ABOVE RIGHT/LEFTWARDS ARROW
	      U+2983, U+2984   LEFT/RIGHT WHITE	CURLY BRACKET
	      U+2985, U+2986   LEFT/RIGHT WHITE	PARENTHESIS
	      U+2987, U+2988   Z NOTATION LEFT/RIGHT IMAGE BRACKET
	      U+2989, U+298A   Z NOTATION LEFT/RIGHT BINDING BRACKET
	      U+298B, U+298C   LEFT/RIGHT SQUARE BRACKET WITH UNDERBAR
	      U+298D, U+2990   LEFT/RIGHT SQUARE BRACKET WITH TICK IN TOP
				 CORNER
	      U+298F, U+298E   LEFT/RIGHT SQUARE BRACKET WITH TICK IN BOTTOM
				 CORNER
	      U+2991, U+2992   LEFT/RIGHT ANGLE	BRACKET	WITH DOT
	      U+2993, U+2994   LEFT/RIGHT ARC LESS-THAN/GREATER-THAN BRACKET
	      U+2995, U+2996   DOUBLE LEFT/RIGHT ARC GREATER-THAN/LESS-THAN
				 BRACKET
	      U+2997, U+2998   LEFT/RIGHT BLACK	TORTOISE SHELL BRACKET
	      U+29A8, U+29A9   MEASURED	ANGLE WITH OPEN	ARM ENDING IN ARROW
				 POINTING UP AND RIGHT/LEFT
	      U+29AA, U+29AB   MEASURED	ANGLE WITH OPEN	ARM ENDING IN ARROW
				 POINTING DOWN AND RIGHT/LEFT
	      U+29B3, U+29B4   EMPTY SET WITH RIGHT/LEFT ARROW ABOVE
	      U+29C0, U+29C1   CIRCLED LESS-THAN/GREATER-THAN
	      U+29D8, U+29D9   LEFT/RIGHT WIGGLY FENCE
	      U+29DA, U+29DB   LEFT/RIGHT DOUBLE WIGGLY	FENCE
	      U+29FC, U+29FD   LEFT/RIGHT-POINTING CURVED ANGLE	BRACKET
	      U+2A79, U+2A7A   LESS-THAN/GREATER-THAN WITH CIRCLE INSIDE
	      U+2A7B, U+2A7C   LESS-THAN/GREATER-THAN WITH QUESTION MARK ABOVE
	      U+2A7D, U+2A7E   LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO
	      U+2A7F, U+2A80   LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO WITH
				 DOT INSIDE
	      U+2A81, U+2A82   LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO WITH
				 DOT ABOVE
	      U+2A83, U+2A84   LESS-THAN/GREATER-THAN OR SLANTED EQUAL TO WITH
				 DOT ABOVE RIGHT/LEFT
	      U+2A85, U+2A86   LESS-THAN/GREATER-THAN OR APPROXIMATE
	      U+2A87, U+2A88   LESS-THAN/GREATER-THAN AND SINGLE-LINE NOT
				 EQUAL TO
	      U+2A89, U+2A8A   LESS-THAN/GREATER-THAN AND NOT APPROXIMATE
	      U+2A8D, U+2A8E   LESS-THAN/GREATER-THAN ABOVE SIMILAR OR EQUAL
	      U+2A95, U+2A96   SLANTED EQUAL TO	OR LESS-THAN/GREATER-THAN
	      U+2A97, U+2A98   SLANTED EQUAL TO	OR LESS-THAN/GREATER-THAN WITH
				 DOT INSIDE
	      U+2A99, U+2A9A   DOUBLE-LINE EQUAL TO OR LESS-THAN/GREATER-THAN
	      U+2A9B, U+2A9C   DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN/
				 GREATER-THAN
	      U+2A9D, U+2A9E   SIMILAR OR LESS-THAN/GREATER-THAN
	       U+2A9F, U+2AA0	SIMILAR	ABOVE LESS-THAN/GREATER-THAN ABOVE
				 EQUALS	SIGN
	      U+2AA1, U+2AA2   DOUBLE NESTED LESS-THAN/GREATER-THAN
	      U+2AA6, U+2AA7   LESS-THAN/GREATER-THAN CLOSED BY	CURVE
	      U+2AA8, U+2AA9   LESS-THAN/GREATER-THAN CLOSED BY	CURVE ABOVE
				 SLANTED EQUAL
	      U+2AAA, U+2AAB   SMALLER THAN/LARGER THAN
	      U+2AAC, U+2AAD   SMALLER THAN/LARGER THAN	OR EQUAL TO
	      U+2AAF, U+2AB0   PRECEDES/SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
	      U+2AB1, U+2AB2   PRECEDES/SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
	      U+2AB3, U+2AB4   PRECEDES/SUCCEEDS ABOVE EQUALS SIGN
	      U+2AB5, U+2AB6   PRECEDES/SUCCEEDS ABOVE NOT EQUAL TO
	      U+2AB7, U+2AB8   PRECEDES/SUCCEEDS ABOVE ALMOST EQUAL TO
	      U+2AB9, U+2ABA   PRECEDES/SUCCEEDS ABOVE NOT ALMOST EQUAL	TO
	      U+2ABB, U+2ABC   DOUBLE PRECEDES/SUCCEEDS
	      U+2ABD, U+2ABE   SUBSET/SUPERSET WITH DOT
	      U+2ABF, U+2AC0   SUBSET/SUPERSET WITH PLUS SIGN BELOW
	      U+2AC1, U+2AC2   SUBSET/SUPERSET WITH MULTIPLICATION SIGN	BELOW
	      U+2AC3, U+2AC4   SUBSET/SUPERSET OF OR EQUAL TO WITH DOT ABOVE
	      U+2AC5, U+2AC6   SUBSET/SUPERSET OF ABOVE	EQUALS SIGN
	      U+2AC7, U+2AC8   SUBSET/SUPERSET OF ABOVE	TILDE OPERATOR
	      U+2AC9, U+2ACA   SUBSET/SUPERSET OF ABOVE	ALMOST EQUAL TO
	      U+2ACB, U+2ACC   SUBSET/SUPERSET OF ABOVE	NOT EQUAL TO
	      U+2ACF, U+2AD0   CLOSED SUBSET/SUPERSET
	      U+2AD1, U+2AD2   CLOSED SUBSET/SUPERSET OR EQUAL TO
	      U+2AD5, U+2AD6   SUBSET/SUPERSET ABOVE SUBSET/SUPERSET
	      U+2AE5, U+22AB   DOUBLE VERTICAL BAR DOUBLE LEFT/RIGHT TURNSTILE
	      U+2AF7, U+2AF8   TRIPLE NESTED LESS-THAN/GREATER-THAN
	      U+2AF9, U+2AFA   DOUBLE-LINE SLANTED LESS-THAN/GREATER-THAN OR
				 EQUAL TO
	      U+2B46, U+2B45   RIGHT/LEFTWARDS QUADRUPLE ARROW
	      U+2B47, U+2B49   REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW,
				 TILDE OPERATOR	ABOVE LEFTWARDS	ARROW
	      U+2B48, U+2B4A   RIGHTWARDS ARROW	ABOVE REVERSE ALMOST EQUAL
				 TO,  LEFTWARDS	ARROW ABOVE ALMOST EQUAL TO
	      U+2B4C, U+2973   RIGHTWARDS ARROW	ABOVE REVERSE TILDE OPERATOR,
				 LEFTWARDS ARROW ABOVE TILDE OPERATOR
	       U+2B62, U+2B60	RIGHT/LEFTWARDS	TRIANGLE-HEADED	ARROW
	      U+2B6C, U+2B6A   RIGHT/LEFTWARDS TRIANGLE-HEADED DASHED ARROW
	      U+2B72, U+2B70   RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW TO	BAR
	      U+2B7C, U+2B7A   RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH
				 DOUBLE	VERTICAL STROKE
	      U+2B86, U+2B84   RIGHT/LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS
	      U+2B8A, U+2B88   RIGHT/LEFTWARDS BLACK CIRCLED WHITE ARROW
	      U+2B95, U+2B05   RIGHT/LEFTWARDS BLACK ARROW
	      U+2B9A, U+2B98   THREE-D TOP-LIGHTED RIGHT/LEFTWARDS EQUILATERAL
				 ARROWHEAD
	      U+2B9E, U+2B9C   BLACK RIGHT/LEFTWARDS EQUILATERAL ARROWHEAD
	       U+2BA1, U+2BA0	DOWNWARDS TRIANGLE-HEADED ARROW	WITH LONG TIP
				 RIGHT/LEFTWARDS
	      U+2BA3, U+2BA2   UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP
				 RIGHT/LEFTWARDS
	      U+2BA9, U+2BA8   BLACK CURVED DOWNWARDS AND RIGHT/LEFTWARDS ARROW
	      U+2BAB, U+2BAA   BLACK CURVED UPWARDS AND	RIGHT/LEFTWARDS	ARROW
	      U+2BB1, U+2BB0   RIBBON ARROW DOWN RIGHT/LEFT
	      U+2BB3, U+2BB2   RIBBON ARROW UP RIGHT/LEFT
	      U+2BEE, U+2BEC   RIGHT/LEFTWARDS TWO-HEADED ARROW	WITH TRIANGLE
				 ARROWHEADS
	      U+2E02, U+2E03   LEFT/RIGHT SUBSTITUTION BRACKET
	      U+2E03, U+2E02   RIGHT/LEFT SUBSTITUTION BRACKET
	      U+2E04, U+2E05   LEFT/RIGHT DOTTED SUBSTITUTION BRACKET
	      U+2E05, U+2E04   RIGHT/LEFT DOTTED SUBSTITUTION BRACKET
	      U+2E09, U+2E0A   LEFT/RIGHT TRANSPOSITION	BRACKET
	      U+2E0A, U+2E09   RIGHT/LEFT TRANSPOSITION	BRACKET
	      U+2E0C, U+2E0D   LEFT/RIGHT RAISED OMISSION BRACKET
	      U+2E0D, U+2E0C   RIGHT/LEFT RAISED OMISSION BRACKET
	      U+2E11, U+2E10   REVERSED	FORKED PARAGRAPHOS,  FORKED PARAGRAPHOS
	      U+2E1C, U+2E1D   LEFT/RIGHT LOW PARAPHRASE BRACKET
	      U+2E1D, U+2E1C   RIGHT/LEFT LOW PARAPHRASE BRACKET
	       U+2E20, U+2E21	LEFT/RIGHT VERTICAL BAR	WITH QUILL
	       U+2E21, U+2E20	RIGHT/LEFT VERTICAL BAR	WITH QUILL
	      U+2E22, U+2E23   TOP LEFT/RIGHT HALF BRACKET
	      U+2E24, U+2E25   BOTTOM LEFT/RIGHT HALF BRACKET
	      U+2E26, U+2E27   LEFT/RIGHT SIDEWAYS U BRACKET
	      U+2E28, U+2E29   LEFT/RIGHT DOUBLE PARENTHESIS
	      U+2E36, U+2E37   DAGGER WITH LEFT/RIGHT GUARD
	      U+2E42, U+201E   DOUBLE LOW-REVERSED-9 QUOTATION MARK,  DOUBLE
				 LOW-9 QUOTATION MARK
	      U+2E55, U+2E56   LEFT/RIGHT SQUARE BRACKET WITH STROKE
	      U+2E57, U+2E58   LEFT/RIGHT SQUARE BRACKET WITH DOUBLE STROKE
	      U+2E59, U+2E5A   TOP HALF	LEFT/RIGHT PARENTHESIS
	      U+2E5B, U+2E5C   BOTTOM HALF LEFT/RIGHT PARENTHESIS
	    U+3008, U+3009   LEFT/RIGHT	ANGLE BRACKET
	    U+300A, U+300B   LEFT/RIGHT	DOUBLE ANGLE BRACKET
	    U+300C, U+300D   LEFT/RIGHT	CORNER BRACKET
	    U+300E, U+300F   LEFT/RIGHT	WHITE CORNER BRACKET
	    U+3010, U+3011   LEFT/RIGHT	BLACK LENTICULAR BRACKET
	    U+3014, U+3015   LEFT/RIGHT	TORTOISE SHELL BRACKET
	    U+3016, U+3017   LEFT/RIGHT	WHITE LENTICULAR BRACKET
	    U+3018, U+3019   LEFT/RIGHT	WHITE TORTOISE SHELL BRACKET
	    U+301A, U+301B   LEFT/RIGHT	WHITE SQUARE BRACKET
	    U+301D, U+301E   REVERSED DOUBLE PRIME QUOTATION MARK,  DOUBLE
				 PRIME QUOTATION MARK
	      U+A9C1, U+A9C2   JAVANESE	LEFT/RIGHT RERENGGAN
	      U+FD3E, U+FD3F   ORNATE LEFT/RIGHT PARENTHESIS
	    U+FE59, U+FE5A   SMALL LEFT/RIGHT PARENTHESIS
	    U+FE5B, U+FE5C   SMALL LEFT/RIGHT CURLY BRACKET
	    U+FE5D, U+FE5E   SMALL LEFT/RIGHT TORTOISE SHELL BRACKET
	    U+FE64, U+FE65   SMALL LESS-THAN/GREATER-THAN SIGN
	    U+FF08, U+FF09   FULLWIDTH LEFT/RIGHT PARENTHESIS
	    U+FF1C, U+FF1E   FULLWIDTH LESS-THAN/GREATER-THAN SIGN
	    U+FF3B, U+FF3D   FULLWIDTH LEFT/RIGHT SQUARE BRACKET
	    U+FF5B, U+FF5D   FULLWIDTH LEFT/RIGHT CURLY	BRACKET
	     U+FF5F, U+FF60   FULLWIDTH	LEFT/RIGHT WHITE PARENTHESIS
	      U+FF62, U+FF63   HALFWIDTH LEFT/RIGHT CORNER BRACKET
	      U+FFEB, U+FFE9   HALFWIDTH RIGHT/LEFTWARDS ARROW
	      U+1D103, U+1D102 MUSICAL SYMBOL REVERSE FINAL BARLINE,  MUSICAL
				 SYMBOL	FINAL BARLINE
	      U+1D106, U+1D107 MUSICAL SYMBOL LEFT/RIGHT REPEAT	SIGN
	    U+1F449, U+1F448 WHITE RIGHT/LEFT POINTING BACKHAND	INDEX
	     U+1F508, U+1F568 SPEAKER,	RIGHT SPEAKER
	     U+1F509, U+1F569 SPEAKER WITH ONE SOUND WAVE,  RIGHT SPEAKER WITH
				 ONE SOUND WAVE
	     U+1F50A, U+1F56A SPEAKER WITH THREE SOUND WAVES,  RIGHT SPEAKER
				 WITH THREE SOUND WAVES
	      U+1F57B, U+1F57D LEFT/RIGHT HAND TELEPHONE RECEIVER
	      U+1F599, U+1F598 SIDEWAYS	WHITE RIGHT/LEFT POINTING INDEX
	      U+1F59B, U+1F59A SIDEWAYS	BLACK RIGHT/LEFT POINTING INDEX
	      U+1F59D, U+1F59C BLACK RIGHT/LEFT	POINTING BACKHAND INDEX
	      U+1F5E6, U+1F5E7 THREE RAYS LEFT/RIGHT
		U+1F802, U+1F800 RIGHT/LEFTWARDS ARROW WITH SMALL TRIANGLE
				 ARROWHEAD
		U+1F806, U+1F804 RIGHT/LEFTWARDS ARROW WITH MEDIUM TRIANGLE
				 ARROWHEAD
		U+1F80A, U+1F808 RIGHT/LEFTWARDS ARROW WITH LARGE TRIANGLE
				 ARROWHEAD
		U+1F812, U+1F810 RIGHT/LEFTWARDS ARROW WITH SMALL EQUILATERAL
				 ARROWHEAD
		U+1F816, U+1F814 RIGHT/LEFTWARDS ARROW WITH EQUILATERAL	ARROWHEAD
		U+1F81A, U+1F818 HEAVY RIGHT/LEFTWARDS ARROW WITH EQUILATERAL
				 ARROWHEAD
		U+1F81E, U+1F81C HEAVY RIGHT/LEFTWARDS ARROW WITH LARGE
				 EQUILATERAL ARROWHEAD
		 U+1F822, U+1F820 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW	WITH
				 NARROW	SHAFT
		U+1F826, U+1F824 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH
				 MEDIUM	SHAFT
		U+1F82A, U+1F828 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD
				 SHAFT
		U+1F82E, U+1F82C RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH
				 HEAVY SHAFT
		U+1F832, U+1F830 RIGHT/LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY
				 HEAVY SHAFT
		U+1F836, U+1F834 RIGHT/LEFTWARDS FINGER-POST ARROW
		U+1F83A, U+1F838 RIGHT/LEFTWARDS SQUARED ARROW
		U+1F83E, U+1F83C RIGHT/LEFTWARDS COMPRESSED ARROW
	      U+1F842, U+1F840 RIGHT/LEFTWARDS HEAVY COMPRESSED	ARROW
	      U+1F846, U+1F844 RIGHT/LEFTWARDS HEAVY ARROW
	      U+1F852, U+1F850 RIGHT/LEFTWARDS SANS-SERIF ARROW
	       U+1F862,	U+1F860	WIDE-HEADED RIGHT/LEFTWARDS LIGHT BARB ARROW
	      U+1F86A, U+1F868 WIDE-HEADED RIGHT/LEFTWARDS BARB	ARROW
	      U+1F872, U+1F870 WIDE-HEADED RIGHT/LEFTWARDS MEDIUM BARB ARROW
	      U+1F87A, U+1F878 WIDE-HEADED RIGHT/LEFTWARDS HEAVY BARB ARROW
	      U+1F882, U+1F880 WIDE-HEADED RIGHT/LEFTWARDS VERY	HEAVY BARB
				 ARROW
	      U+1F892, U+1F890 RIGHT/LEFTWARDS TRIANGLE	ARROWHEAD
	      U+1F896, U+1F894 RIGHT/LEFTWARDS WHITE ARROW WITHIN TRIANGLE
				 ARROWHEAD
	      U+1F89A, U+1F898 RIGHT/LEFTWARDS ARROW WITH NOTCHED TAIL
	       U+1F8A1,	U+1F8A0	RIGHTWARDS BOTTOM SHADED WHITE ARROW,
				 LEFTWARDS BOTTOM-SHADED WHITE ARROW
	      U+1F8A3, U+1F8A2 RIGHT/LEFTWARDS TOP SHADED WHITE	ARROW
	      U+1F8A5, U+1F8A6 RIGHT/LEFTWARDS RIGHT-SHADED WHITE ARROW
	      U+1F8A7, U+1F8A4 RIGHT/LEFTWARDS LEFT-SHADED WHITE ARROW
	      U+1F8A9, U+1F8A8 RIGHT/LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW
	      U+1F8AB, U+1F8AA RIGHT/LEFTWARDS FRONT-TILTED SHADOWED WHITE
				 ARROW
	      U+1F8B6, U+1F8B4 NEGATIVE	SQUARED	RIGHT/LEFTWARDS	ARROW

perl v5.43.3			  2025-09-23			     PERLOP(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=perlop&sektion=1&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help