perlop.html

来自「perl教程」· HTML 代码 · 共 876 行 · 第 1/5 页

HTML
876
字号
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../../displayToc.js"></script>
<script language="JavaScript" src="../../tocParas.js"></script>
<script language="JavaScript" src="../../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../../scineplex.css">
<title>perlop - Perl operators and precedence</title>
<link rel="stylesheet" href="../../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>

<body>

<script>writelinks('__top__',2);</script>
<h1><a>perlop - Perl operators and precedence</a></h1>
<p><a name="__index__"></a></p>

<!-- INDEX BEGIN -->

<ul>

	<li><a href="#name">NAME</a></li>
	<li><a href="#description">DESCRIPTION</a></li>
	<ul>

		<li><a href="#operator_precedence_and_associativity">Operator Precedence and Associativity</a></li>
		<li><a href="#terms_and_list_operators__leftward_">Terms and List Operators (Leftward)</a></li>
		<li><a href="#the_arrow_operator">The Arrow Operator</a></li>
		<li><a href="#autoincrement_and_autodecrement">Auto-increment and Auto-decrement</a></li>
		<li><a href="#exponentiation">Exponentiation</a></li>
		<li><a href="#symbolic_unary_operators">Symbolic Unary Operators</a></li>
		<li><a href="#binding_operators">Binding Operators</a></li>
		<li><a href="#multiplicative_operators">Multiplicative Operators</a></li>
		<li><a href="#additive_operators">Additive Operators</a></li>
		<li><a href="#shift_operators">Shift Operators</a></li>
		<li><a href="#named_unary_operators">Named Unary Operators</a></li>
		<li><a href="#relational_operators">Relational Operators</a></li>
		<li><a href="#equality_operators">Equality Operators</a></li>
		<li><a href="#bitwise_and">Bitwise And</a></li>
		<li><a href="#bitwise_or_and_exclusive_or">Bitwise Or and Exclusive Or</a></li>
		<li><a href="#cstyle_logical_and">C-style Logical And</a></li>
		<li><a href="#cstyle_logical_or">C-style Logical Or</a></li>
		<li><a href="#range_operators">Range Operators</a></li>
		<li><a href="#conditional_operator">Conditional Operator</a></li>
		<li><a href="#assignment_operators">Assignment Operators</a></li>
		<li><a href="#comma_operator">Comma Operator</a></li>
		<li><a href="#list_operators__rightward_">List Operators (Rightward)</a></li>
		<li><a href="#logical_not">Logical Not</a></li>
		<li><a href="#logical_and">Logical And</a></li>
		<li><a href="#logical_or_and_exclusive_or">Logical or and Exclusive Or</a></li>
		<li><a href="#c_operators_missing_from_perl">C Operators Missing From Perl</a></li>
		<li><a href="#quote_and_quotelike_operators">Quote and Quote-like Operators</a></li>
		<li><a href="#regexp_quotelike_operators">Regexp Quote-Like Operators</a></li>
		<li><a href="#gory_details_of_parsing_quoted_constructs">Gory details of parsing quoted constructs</a></li>
		<li><a href="#i_o_operators">I/O Operators</a></li>
		<li><a href="#constant_folding">Constant Folding</a></li>
		<li><a href="#noops">No-ops</a></li>
		<li><a href="#bitwise_string_operators">Bitwise String Operators</a></li>
		<li><a href="#integer_arithmetic">Integer Arithmetic</a></li>
		<li><a href="#floatingpoint_arithmetic">Floating-point Arithmetic</a></li>
		<li><a href="#bigger_numbers">Bigger Numbers</a></li>
	</ul>

</ul>
<!-- INDEX END -->

<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>perlop - Perl operators and precedence</p>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>
</p>
<h2><a name="operator_precedence_and_associativity">Operator Precedence and Associativity</a></h2>
<p>Operator precedence and associativity work in Perl more or less like
they do in mathematics.</p>
<p><em>Operator precedence</em> means some operators are evaluated before
others.  For example, in <code>2 + 4 * 5</code>, the multiplication has higher
precedence so <code>4 * 5</code> is evaluated first yielding <code>2 + 20 ==
22</code> and not <code>6 * 5 == 30</code>.</p>
<p><em>Operator associativity</em> 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 <code>8
- 4 - 2</code>, subtraction is left associative so Perl evaluates the
expression left to right.  <code>8 - 4</code> is evaluated first making the
expression <code>4 - 2 == 2</code> and not <code>8 - 2 == 6</code>.</p>
<p>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.</p>
<pre>
    left        terms and list operators (leftward)
    left        -&gt;
    nonassoc    ++ --
    right       **
    right       ! ~ \ and unary + and -
    left        =~ !~
    left        * / % x
    left        + - .
    left        &lt;&lt; &gt;&gt;
    nonassoc    named unary operators
    nonassoc    &lt; &gt; &lt;= &gt;= lt gt le ge
    nonassoc    == != &lt;=&gt; eq ne cmp
    left        &amp;
    left        | ^
    left        &amp;&amp;
    left        ||
    nonassoc    ..  ...
    right       ?:
    right       = += -= *= etc.
    left        , =&gt;
    nonassoc    list operators (rightward)
    right       not
    left        and
    left        or xor</pre>
<p>In the following sections, these operators are covered in precedence order.</p>
<p>Many operators can be overloaded for objects.  See <a href="../../lib/overload.html">the overload manpage</a>.</p>
<p>
</p>
<h2><a name="terms_and_list_operators__leftward_">Terms and List Operators (Leftward)</a></h2>
<p>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 <a href="../../lib/Pod/perlfunc.html">the perlfunc manpage</a>.</p>
<p>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.</p>
<p>In the absence of parentheses, the precedence of list operators such as
<a href="../../lib/Pod/perlfunc.html#item_print"><code>print</code></a>, <a href="../../lib/Pod/perlfunc.html#item_sort"><code>sort</code></a>, or <a href="../../lib/Pod/perlfunc.html#item_chmod"><code>chmod</code></a> 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</p>
<pre>
    <span class="variable">@ary</span> <span class="operator">=</span> <span class="operator">(</span><span class="number">1</span><span class="operator">,</span> <span class="number">3</span><span class="operator">,</span> <span class="keyword">sort</span> <span class="number">4</span><span class="operator">,</span> <span class="number">2</span><span class="operator">);</span>
    <span class="keyword">print</span> <span class="variable">@ary</span><span class="operator">;</span>         <span class="comment"># prints 1324</span>
</pre>
<p>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:</p>
<pre>
    <span class="comment"># These evaluate exit before doing the print:</span>
    <span class="keyword">print</span><span class="operator">(</span><span class="variable">$foo</span><span class="operator">,</span> <span class="keyword">exit</span><span class="operator">);</span>  <span class="comment"># Obviously not what you want.</span>
    <span class="keyword">print</span> <span class="variable">$foo</span><span class="operator">,</span> <span class="keyword">exit</span><span class="operator">;</span>   <span class="comment"># Nor is this.</span>
</pre>
<pre>
    <span class="comment"># These do the print before evaluating exit:</span>
    <span class="operator">(</span><span class="keyword">print</span> <span class="variable">$foo</span><span class="operator">),</span> <span class="keyword">exit</span><span class="operator">;</span> <span class="comment"># This is what you want.</span>
    <span class="keyword">print</span><span class="operator">(</span><span class="variable">$foo</span><span class="operator">),</span> <span class="keyword">exit</span><span class="operator">;</span>  <span class="comment"># Or this.</span>
    <span class="keyword">print</span> <span class="operator">(</span><span class="variable">$foo</span><span class="operator">),</span> <span class="keyword">exit</span><span class="operator">;</span> <span class="comment"># Or even this.</span>
</pre>
<p>Also note that</p>
<pre>
    <span class="keyword">print</span> <span class="operator">(</span><span class="variable">$foo</span> <span class="operator">&amp;</span> <span class="number">255</span><span class="operator">)</span> <span class="operator">+</span> <span class="number">1</span><span class="operator">,</span> <span class="string">"\n"</span><span class="operator">;</span>
</pre>
<p>probably doesn't do what you expect at first glance.  The parentheses
enclose the argument list for <a href="../../lib/Pod/perlfunc.html#item_print"><code>print</code></a> which is evaluated (printing
the result of <code>$foo &amp; 255</code>).  Then one is added to the return value
of <a href="../../lib/Pod/perlfunc.html#item_print"><code>print</code></a> (usually 1).  The result is something like this:</p>
<pre>
    <span class="number">1</span> <span class="operator">+</span> <span class="number">1</span><span class="operator">,</span> <span class="string">"\n"</span><span class="operator">;</span>    <span class="comment"># Obviously not what you meant.</span>
</pre>
<p>To do what you meant properly, you must write:</p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?