*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->OpenBSD man pages -> perlop (1)              



NAME    [Toc]    [Back]

       perlop - Perl operators and precedence

DESCRIPTION    [Toc]    [Back]

       Operator Precedence and Associativity

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

       Operator precedence means some operators are evaluated
       before others.  For example, in "2 + 4 * 5", the multiplication
 has higher precedence so "4 * 5" is evaluated first
       yielding "2 + 20 == 22" and not "6 * 5 == 30".

       Operator associativity defines what happens if a sequence
       of the same operators is used one after another: whether
       the evaluator will evaluate the left operations first or
       the right.  For example, in "8 - 4 - 2", subtraction is
       left associative so Perl evaluates the expression left to
       right.  "8 - 4" is evaluated first making the expression
       "4 - 2 == 2" and not "8 - 2 == 6".

       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    < > <= >= lt gt le ge
           nonassoc    == != <=> eq ne cmp
           left        &
           left        | ^
           left        &&
           left        ||
           nonassoc    ..  ...
           right       ?:
           right       = += -= *= etc.
           left        , =>
           nonassoc    list operators (rightward)
           right       not
           left        and
           left        or xor
       In the following sections, these operators are covered in
       precedence order.

       Many operators can be overloaded for objects.  See overload.

       Terms and List Operators (Leftward)    [Toc]    [Back]

       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

           # 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, "0;

       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, "0;    # Obviously not what you meant.

       To do what you meant properly, you must write:

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

       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" toward the end
       of this section, as well as "I/O Operators".

       The Arrow Operator    [Toc]    [Back]

       ""->"" is an infix dereference operator, just as it is in
       C and C++.  If the right side is either 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 the left side must be either an
       object (a blessed reference) or a class name (that is, a
       package name).  See perlobj.

       Auto-increment and Auto-decrement    [Toc]    [Back]

       "++" 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 behaviour.  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]*", 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    [Toc]    [Back]

       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.)

       Symbolic Unary Operators    [Toc]    [Back]

       Unary "!" performs logical negation, i.e., "not".  See
       also "not" for a lower precedence version of this.

       Unary "-" performs arithmetic negation if the operand is
       numeric.  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 "-bareword".

       Unary "~" performs bitwise negation, i.e., 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.
       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 "
       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    [Toc]    [Back]

       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.  Behavior in list context
       depends on the particular operator.  See "Regexp QuoteLike
 Operators" for details.

       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.

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

       Multiplicative Operators    [Toc]    [Back]

       Binary "*" multiplies two numbers.

       Binary "/" divides two numbers.

       Binary "%" computes the modulus of two numbers.  Given
       integer operands $a and $b: If $b is positive, then "$a %
       $b" is $a minus the largest multiple of $b that is not
       greater than $a.  If $b is negative, then "$a % $b" is $a
       minus the smallest multiple of $b that is not less than $a
       (i.e. the result will be less than or equal to zero).
       Note that when "use integer" is in scope, "%" gives you
       direct access to the modulus 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 not enclosed in parentheses, it
       returns a string consisting of the left operand repeated
       the number of times specified by the right operand.  In
       list context, if the left operand is enclosed in parentheses,
 it repeats the list.  If the right operand is zero or
       negative, it returns an empty string or an empty list,
       depending on the context.

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

           print "" 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    [Toc]    [Back]

       Binary "+" returns the sum of two numbers.

       Binary "-" returns the difference of two numbers.

       Binary "." concatenates two strings.

       Shift Operators    [Toc]    [Back]

       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

       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

       Note that both "<<" and ">>" in Perl are implemented
       directly using "<<" and ">>" in C.  If "use integer" (see
       "Integer Arithmetic") is in force then signed C integers
       are used, else unsigned C integers are used.  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).

       The result of overflowing the range of the integers is
       undefined because it is undefined also in C.  In other
       words, using 32-bit integers, "1 << 32" is undefined.
       Shifting by a negative number of bits is also undefined.

       Named Unary Operators    [Toc]    [Back]

       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)".

       Relational Operators    [Toc]    [Back]

       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.
       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 "<=>" 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
 NaNs (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 NaNs then NaN is just a string
       with numeric value 0.

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

       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.

       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.

       "lt", "le", "ge", "gt" and "cmp" use the collation (sort)
       order specified by the current locale if "use locale" is
       in effect.  See perllocale.

       Bitwise And    [Toc]    [Back]

       Binary "&" returns its operands ANDed together bit by bit.
       (See also "Integer Arithmetic" and "Bitwise String Operators".)

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

               print "Even0 if ($x & 1) == 0;

       Bitwise Or and Exclusive Or    [Toc]    [Back]

       Binary "|" returns its operands ORed together bit by  bit.
       (See also "Integer Arithmetic" and "Bitwise String Operators".)

       Binary "^" returns its operands XORed together bit by bit.
       (See also "Integer Arithmetic" and "Bitwise String Operators".)

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

               print "false0 if (8 | 2) != 10;

       C-style Logical And    [Toc]    [Back]

       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.

       C-style Logical Or    [Toc]    [Back]

       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 is evaluated.

       The "||" and "&&" operators return the last value evaluated
 (unlike C's "||" and "&&", which return 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!0;

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

           @a = @b || @c;              # this is wrong
           @a = scalar(@b) || @c;      # really meant this
           @a = @b ? @b : @c;          # this works fine, though

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

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

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

           unlink("alpha", "beta", "gamma")
                   || (gripe(), next LINE);
       Using "or" for assignment is unlikely to do what you want;
       see below.

       Range Operators    [Toc]    [Back]

       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.
       In the current implementation, no temporary array is created
 when the range operator is used as the expression in
       "foreach" loops, but older versions of Perl might burn a
       lot of memory when you write something like this:

           for (1 .. 1_000_000) {
               # code

       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.
       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 till 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.


       As a scalar operator:

           if (101 .. 200) { print; } # print 2nd hundred  lines,
short for
                                      #    if ($. == 101 .. $. ==
200) ...
           next line if (1 .. /^$/);  # skip header lines,  short
                                      #    ...  if  ($.  ==  1 ..
           s/^/> / if (/^$/ .. eof()); # quote body

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

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

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

               if (/0/ .. /1/)
                   print "$_0;

       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

       The range operator (in list context) makes use of the magical
 auto-increment algorithm if the operands are strings.
       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, or

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

       to get dates with leading zeros.  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.

       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);

       Conditional Operator    [Toc]    [Back]

       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.0, $n,
                   ($n == 1) ? '' : "s";

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

           $a = $ok ? $b : $c;  # get a scalar
           @a = $ok ? @b : @c;  # get an array
           $a = $ok ? @b : @c;  # 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):
           ($a_or_b ? $a : $b) = $c;

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

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

       Really means this:

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

       Rather than this:

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

       That should probably be written more simply as:

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

       Assignment Operators    [Toc]    [Back]

       "=" is the ordinary assignment operator.

       Assignment operators work as in C.  That is,

           $a += 2;

       is equivalent to

           $a = $a + 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:

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

       Although these are grouped by family, they all have the
       precedence of assignment.

       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 [A-Z] [a-z];

           ($a += 2) *= 3;

       is equivalent to

           $a += 2;
           $a *= 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.

       Comma Operator    [Toc]    [Back]

       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.

       The "=>" operator is a synonym for the comma, but forces
       any word to its left to be interpreted as a string (as of
       5.001). It is helpful in documenting the correspondence
       between keys and values in hashes, and other paired elements
 in lists.

       List Operators (Rightward)    [Toc]    [Back]

       On the right side of a list operator, it 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 extra parentheses:

           open HANDLE, "filename"
               or die "Can't open: $!0;

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

       Logical Not    [Toc]    [Back]

       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    [Toc]    [Back]

       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: i.e., the right expression is evaluated
       only if the left expression is true.

       Logical or and Exclusive Or    [Toc]    [Back]

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

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

       This means that it short-circuits: i.e., the right expression
 is evaluated only if the left expression is false.
       Due to its precedence, you should probably avoid using
       this for assignment, only for control flow.

           $a = $b or $c;              # bug: this is wrong
           ($a = $b) or $c;            # really means this
           $a = $b || $c;              # 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 exclusive-OR of the two surrounding
 expressions.  It cannot short circuit, of course.

       C Operators Missing From Perl    [Toc]    [Back]

       Here is what C has that Perl doesn't:

       unary & Address-of operator.  (But see the "
               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    [Toc]    [Back]

       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)
               <<EOF                 here-doc            yes*

               * unless the delimiter is ''.

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


       is the same as


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

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

       is a syntax error. The "Text::Balanced" module (from CPAN,
       and starting from Perl 5.8 part of the standard distribution)
 is able to do this properly.

       There can 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 following escape sequences are available in constructs
       that interpolate and in transliterations.
                     tab             (HT, TAB)
                    nreturn         ((CR)

                    form feed       (FF)
                   backspace       (BS)
                     alarm (bell)    (BEL)
           \          escape          (ESC)
            33        octal char      (ESC)
           b        hex char        (ESC)
           }    wide hex char   (SMILEY)

                      ame}    named Unicode character

       NOTE: Unlike C and other languages, Perl has no escape
       sequence for the vertical tab (VT - ASCII 11).

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

                    lowercase next char
                     uppercase next char
                    lowercase  till             U          uppercase till                      end case modification
           Q          quote non-word characters till
       If "use locale" is in effect, the case map used by "
       " "" and "U" is taken from the current locale.  See
       perllocale.  If Unicode (for example, "" or wide hex
       characters of 0x100 or beyond) is being used, the case map
       used by " " "" and "U" is as defined by Unicode.
  For documentation of "ame}", see charnames.

       All systems use the virtual "0 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"PaslASCIIcCRsande"0oasrASCIIeLF.NoForll
       systems read "
       example, on a Mac, these are reversed, and on systems
       without line terminator, printing "0 may emit no actual
       data.  In general, use "0 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 (" 15 12" or "       line terminators, and although they often accept just
       " 12", they seldom tolerate just " 15".  If you get in
       the habit of using "0 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 only interpolated if the name is
       enclosed in braces "@{+}".

       You cannot include a literal "$" or "@" within a "Q"
       sequence.  An unescaped "$" or "@" interpolates the corresponding
 variable, while escaping will cause the literal
       string " to be inserted.  You'll need to write something
 like "m/Quser\@Qhost/".

       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, backquotes
 do NOT interpolate within double quotes, nor do
       single quotes impede evaluation of variables when used
       within double quotes.

       Regexp Quote-Like Operators    [Toc]    [Back]

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

               This is just like the "/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 "??"  patterns local to the current
 package are reset.

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

               This usage is vaguely deprecated, which means it
               just might possibly be removed in some distant
               future version of Perl, perhaps somewhere around
               the year 2168.
               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.  See perllocale for
               discussion of additional considerations that apply
               when "use locale" is in effect.

               Options are:

                   c   Do not reset search position on  a  failed
match when /g is in effect.
                   g    Match  globally,  i.e.,  find  all occurrences.
                   i   Do case-insensitive pattern matching.
                   m   Treat string as multiple lines.
                   o   Compile pattern only once.
                   s   Treat string as single line.
                   x   Use extended regular expressions.

               If "/" is the delimiter then the initial "m" is
               optional.  With the "m" you can use any pair of
               non-alphanumeric, non-whitespace characters as
               delimiters.  This is particularly useful for
               matching path names that contain "/", to avoid LTS
               (leaning toothpick syndrome).  If "?" is the
               delimiter, then the match-only-once rule of "?PATTERN?"
 applies.  If "'" is the delimiter, no
               interpolation is performed on the PATTERN.

               PATTERN may contain variables, which will be
               interpolated (and the pattern recompiled) 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.)  If you want such
               a pattern to be compiled only once, add a "/o"
               after the trailing delimiter.  This avoids expensive
 run-time recompilations, and is useful when
               the value you are interpolating won't change over
               the life of the script.  However, mentioning "/o"
               constitutes a promise that you won't change the
               variables in the pattern.  If you change them,
               Perl won't even notice.  See also

               If the PATTERN evaluates to the empty string, the
               last successfully matched regular expression is
               used instead. In this case, only the "g" and "c"
               flags on the empty pattern is honoured - 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).

               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,
               i.e., ($1, $2, $3...).  (Note that here $1 etc.
               are also set, and that this differs from Perl 4's
               behavior.)  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.


                   open(TTY, '/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/o;        #  compile only

                   if (($F1, $F2, $Etc) = ($foo =~ /^()(.*)/))

               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, i.e., 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 (e.g. "m//gc").  Modifying
 the target string also resets the search position.

               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(), 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  "0                beginning  of
the string.  Note also that, currently,
 "G" is only properly supported when
               anchored at the very beginning of the pattern.


                   # list context
                   ($one,$five,$fifteen)     =    (`uptime`    =~

                   # scalar context
                   $/ = "";
                   while (defined($paragraph = <>)) {
                       while      ($paragraph       =~       /[az]['")]*[.!?]+['")]*g) {
                   print "$sentences0;

                   # using m//gc with G
                   $_ = "ppooqppqq";
                   while ($i++ < 2) {
                       print "1: '";
                       print  $1  while /(o)/gc; print "', pos=",
pos, "0;
                       print "2: '";
                       print $1 if /G(q)/gc;   print  "',  pos=",
pos, "0;
                       print "3: '";
                       print  $1  while /(p)/gc; print "', pos=",
pos, "0;
                   print "Final: '$1', pos=",pos,"0 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 older
               (pre-5.6.0) 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 = new URI::URL "http://www/";   die  if
$url eq "xXx";                                                 ,
                EOL                                            .
   ,            LOOP:                                          ;
   .               {                                           ]
   ,                 print(" digits"),         redo LOOP if /G+?
   .                 print(" lowercase"),      redo LOOP if /G[az]+;    ,                                                      g
   ]    .            print(" UPPERCASE"),      redo LOOP if /G[AZ]+?  , ;                                                      ;
   /  . ]            print(" Capitalized"),    redo LOOP if /G[AZ][ga-z;+?,
   c  ] /.           print(" MiXeD"),          redo LOOP if /G[AZa-z]+? g;
      / c]           print(" alphanumeric"),   redo LOOP if /G[AZa-z0-9]+?
      c  /           print("  line-noise"),      redo   LOOP   if
         c           print ". That's all!0;
         ;         }

               Here is the output (split into several lines):

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

               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  =  '0;                 # a two-character

               A double-quoted, interpolated string.
PERLOP(1)        Perl Programmers Rlference Guide       PERLOP(1)
                   $_ .= qq        a
                    (*** The previovs line contains  the  naughty
word "$1".0                        a
                               if /|
                   $baz  =  "0;    p            # a one-character
string                             y
       qr/STRING/imosx             h
               This operator quoteso(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 interpolation
               is done.  Returns a Perl value which may be used
               instead of the corresponding "/STRING/imosx"

               For example,

                   $rex = qr/my.STRING/is;

               is equivalent to


               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 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/;
                       } @_;

               Precompilation of the pattern into an internal
               representation at the moment of qr() avoids a 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()
               Options are:

                   i   Do case-insensitive pattern matching.
                   m   Treat string as multiple lines.
                   o   Compile pattern only once.
                   s   Treat string as single line.
                   x   Use extended regular expressions.

               See perlre for additional information on valid
               syntax for STRING, and for a detailed look at the
               semantics of regular expressions.

               A string which is (possibly) interpolated and then
               executed as a system command with "/bin/sh" or its
               equivalent.  Shell wildcards, pipes, and redirections
 will be honored.  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 command failed.  In list context,
               returns a list of lines (however you've defined
               lines with $/ or $INPUT_RECORD_SEPARATOR), or an
               empty list if the command failed.

               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

                   $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");

               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 w

 Similar pages
Name OS Title
perljp OpenBSD AEuEU,i Perl Y~YxYE `A^a`I`A Perl xIAx3|xOxex|x3x1/2! Perl 5.8.0 xexeicUni- _ codeYuYYi1/4YEx~AcEyxE...
operator OpenBSD C operator precedence and associativity
operator NetBSD C operator precedence and associativity
operator FreeBSD C operator precedence and order of evaluation
erfcf NetBSD error function operators
erfcf OpenBSD error function operators
erfc NetBSD error function operators
erff NetBSD error function operators
erf NetBSD error function operators
erff FreeBSD error function operators
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service