[win32] merge changes#872,873 from maintbranch
[p5sagit/p5-mst-13.2.git] / pod / perlop.pod
index 81efcb2..4781b7f 100644 (file)
@@ -145,7 +145,7 @@ is returned.  One effect of these rules is that C<-bareword> is equivalent
 to C<"-bareword">.
 
 Unary "~" performs bitwise negation, i.e., 1's complement.
-(See also L<Integer Arithmetic>.)
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
 
 Unary "+" has no effect whatsoever, even on strings.  It is useful
 syntactically for separating a function name from a parenthesized expression
@@ -162,11 +162,11 @@ thing from interpretation.
 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 translation.  The left argument is what is
-supposed to be searched, substituted, or translated instead of the default
+pattern, substitution, or transliteration.  The left argument is what is
+supposed to be searched, substituted, or transliterated instead of the default
 $_.  The return value indicates the success of the operation.  (If the
 right argument is an expression rather than a search pattern,
-substitution, or translation, it is interpreted as a search pattern at run
+substitution, or transliteration, it is interpreted as a search pattern at run
 time.  This can be is less efficient than an explicit search, because the
 pattern must be compiled every time the expression is evaluated.
 
@@ -300,15 +300,15 @@ by the current locale if C<use locale> is in effect.  See L<perllocale>.
 =head2 Bitwise And
 
 Binary "&" returns its operators ANDed together bit by bit.
-(See also L<Integer Arithmetic>.)
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
 
 =head2 Bitwise Or and Exclusive Or
 
 Binary "|" returns its operators ORed together bit by bit.
-(See also L<Integer Arithmetic>.)
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
 
 Binary "^" returns its operators XORed together bit by bit.
-(See also L<Integer Arithmetic>.)
+(See also L<Integer Arithmetic> and L<Bitwise String Operators>.)
 
 =head2 C-style Logical And
 
@@ -392,7 +392,7 @@ As a scalar operator:
 As a list operator:
 
     for (101 .. 200) { print; }        # print $_ 100 times
-    @foo = @foo[$[ .. $#foo];  # an expensive no-op
+    @foo = @foo[0 .. $#foo];   # an expensive no-op
     @foo = @foo[$#foo-4 .. $#foo];     # slice last 5 items
 
 The range operator (in a list context) makes use of the magical
@@ -558,17 +558,27 @@ any pair of delimiters you choose.  Non-bracketing delimiters use
 the same character fore and aft, but the 4 sorts of brackets
 (round, angle, square, curly) will all nest.
 
-    Customary  Generic     Meaning    Interpolates
-       ''       q{}       Literal         no
-       ""      qq{}       Literal         yes
-       ``      qx{}       Command         yes
-               qw{}      Word list        no
-       //       m{}    Pattern match      yes
-                s{}{}   Substitution      yes
-               tr{}{}   Translation       no
+    Customary  Generic        Meaning       Interpolates
+       ''       q{}          Literal             no
+       ""      qq{}          Literal             yes
+       ``      qx{}          Command             yes
+               qw{}         Word list            no
+       //       m{}       Pattern match          yes
+                s{}{}      Substitution          yes
+               tr{}{}    Transliteration         no (but see below)
 
-For constructs that do interpolation, variables beginning with "C<$>" or "C<@>"
-are interpolated, as are the following sequences:
+Note that there can be whitespace between the operator and the quoting
+characters, except when C<#> is being used as the quoting character.
+C<q#foo#> is parsed as being the string C<foo>, while C<q #foo#> is the
+operator C<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.
+
+For constructs that do interpolation, variables beginning with "C<$>"
+or "C<@>" are interpolated, as are the following sequences. Within
+a transliteration, the first ten of these sequences may be used.
 
     \t         tab             (HT, TAB)
     \n         newline         (LF, NL)
@@ -580,6 +590,7 @@ are interpolated, as are the following sequences:
     \033       octal char
     \x1b       hex char
     \c[                control char
+
     \l         lowercase next char
     \u         uppercase next char
     \L         lowercase till \E
@@ -619,9 +630,9 @@ patterns local to the current package are reset.
 This usage is vaguely deprecated, and may be removed in some future
 version of Perl.
 
-=item m/PATTERN/gimosx
+=item m/PATTERN/cgimosx
 
-=item /PATTERN/gimosx
+=item /PATTERN/cgimosx
 
 Searches a string for a pattern match, and in a scalar context returns
 true (1) or false ('').  If no string is specified via the C<=~> or
@@ -634,6 +645,7 @@ when C<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.
@@ -644,7 +656,8 @@ Options are:
 If "/" is the delimiter then the initial C<m> is optional.  With the C<m>
 you can use any pair of non-alphanumeric, non-whitespace characters as
 delimiters.  This is particularly useful for matching Unix path names
-that contain "/", to avoid LTS (leaning toothpick syndrome).
+that contain "/", to avoid LTS (leaning toothpick syndrome).  If "?" is
+the delimiter, then the match-only-once rule of C<?PATTERN?> applies.
 
 PATTERN may contain variables, which will be interpolated (and the
 pattern recompiled) every time the pattern search is evaluated.  (Note
@@ -657,7 +670,7 @@ C</o> constitutes a promise that you won't change the variables in the pattern.
 If you change them, Perl won't even notice.
 
 If the PATTERN evaluates to a null string, the last
-successfully executed regular expression is used instead.
+successfully matched regular expression is used instead.
 
 If used in a context that requires a list value, a pattern match returns a
 list consisting of the subexpressions matched by the parentheses in the
@@ -696,18 +709,22 @@ If there are no parentheses, it returns a list of all the matched
 strings, as if there were parentheses around the whole pattern.
 
 In a scalar context, C<m//g> iterates through the string, returning TRUE
-each time it matches, and FALSE when it eventually runs out of
-matches.  (In other words, it remembers where it left off last time and
-restarts the search at that point.  You can actually find the current
-match position of a string or set it using the pos() function--see
-L<perlfunc/pos>.)  Note that you can use this feature to stack C<m//g>
-matches or intermix C<m//g> matches with C<m/\G.../g>.  Note that
-the C<\G> zero-width assertion is not supported without the C</g>
-modifier; currently, without C</g>, C<\G> behaves just like C<\A>, but
-that's accidental and may change in the future.
-
-If you modify the string in any way, the match position is reset to the
-beginning.  Examples:
+each time it matches, and FALSE when it eventually runs out of matches.
+(In other words, it remembers where it left off last time and restarts
+the search at that point.  You can actually find the current match
+position of a string or set it using the pos() function; see
+L<perlfunc/pos>.)  A failed match normally resets the search position to
+the beginning of the string, but you can avoid that by adding the C</c>
+modifier (e.g. C<m//gc>).  Modifying the target string also resets the
+search position.
+
+You can intermix C<m//g> matches with C<m/\G.../g>, where C<\G> is a
+zero-width assertion that matches the exact position where the previous
+C<m//g>, if any, left off.  The C<\G> assertion is not supported without
+the C</g> modifier; currently, without C</g>, C<\G> behaves just like
+C<\A>, but that's accidental and may change in the future.
+
+Examples:
 
     # list context
     ($one,$five,$fifteen) = (`uptime` =~ /(\d+\.\d+)/g);
@@ -721,15 +738,15 @@ beginning.  Examples:
     }
     print "$sentences\n";
 
-    # using m//g with \G
+    # using m//gc with \G
     $_ = "ppooqppqq";
     while ($i++ < 2) {
         print "1: '";
-        print $1 while /(o)/g; print "', pos=", pos, "\n";
+        print $1 while /(o)/gc; print "', pos=", pos, "\n";
         print "2: '";
-        print $1 if /\G(q)/g;  print "', pos=", pos, "\n";
+        print $1 if /\G(q)/gc;  print "', pos=", pos, "\n";
         print "3: '";
-        print $1 while /(p)/g; print "', pos=", pos, "\n";
+        print $1 while /(p)/gc; print "', pos=", pos, "\n";
     }
 
 The last example should print:
@@ -741,23 +758,23 @@ The last example should print:
     2: 'q', pos=8
     3: '', pos=8
 
-A useful idiom for C<lex>-like scanners is C</\G.../g>. You can
+A useful idiom for C<lex>-like scanners is C</\G.../gc>.  You can
 combine several regexps like this to process a string part-by-part,
-doing different actions depending on which regexp matched.  The next
-regexp would step in at the place the previous one left off.
+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\d+\b[,.;]?\s*/g;
-      print(" lowercase"),     redo LOOP if /\G[a-z]+\b[,.;]?\s*/g;
-      print(" UPPERCASE"),     redo LOOP if /\G[A-Z]+\b[,.;]?\s*/g;
-      print(" Capitalized"),   redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/g;
-      print(" MiXeD"),         redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/g;
-      print(" alphanumeric"),  redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/g;
-      print(" line-noise"),    redo LOOP if /\G[^A-Za-z0-9]+/g;
+      print(" digits"),                redo LOOP if /\G\d+\b[,.;]?\s*/gc;
+      print(" lowercase"),     redo LOOP if /\G[a-z]+\b[,.;]?\s*/gc;
+      print(" UPPERCASE"),     redo LOOP if /\G[A-Z]+\b[,.;]?\s*/gc;
+      print(" Capitalized"),   redo LOOP if /\G[A-Z][a-z]+\b[,.;]?\s*/gc;
+      print(" MiXeD"),         redo LOOP if /\G[A-Za-z]+\b[,.;]?\s*/gc;
+      print(" alphanumeric"),  redo LOOP if /\G[A-Za-z0-9]+\b[,.;]?\s*/gc;
+      print(" line-noise"),    redo LOOP if /\G[^A-Za-z0-9]+/gc;
       print ". That's all!\n";
     }
 
@@ -803,6 +820,24 @@ with $/ or $INPUT_RECORD_SEPARATOR).
 
     $today = qx{ date };
 
+Note that how the 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.
+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 (e.g. C<;> on many Unix
+shells; C<&> on the Windows NT C<cmd> shell).
+
+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.
+
+Also realize that using this operator frequently leads to unportable
+programs.
+
 See L<"I/O Operators"> for more discussion.
 
 =item qw/STRING/
@@ -921,16 +956,18 @@ to occur.  Here are two common cases:
 
 =item y/SEARCHLIST/REPLACEMENTLIST/cds
 
-Translates all occurrences of the characters found in the search list
+Transliterates all occurrences of the characters found in the search list
 with the corresponding character in the replacement list.  It returns
 the number of characters replaced or deleted.  If no string is
-specified via the =~ or !~ operator, the $_ string is translated.  (The
+specified via the =~ or !~ operator, the $_ string is transliterated.  (The
 string specified with =~ must be a scalar variable, an array element, a
 hash element, or an assignment to one of those, i.e., an lvalue.)
+A character range may be specified with a hyphen, so C<tr/A-J/0-9/> 
+does the same replacement as C<tr/ACEGIBDFHJ/0246813579/>.
 For B<sed> devotees, C<y> is provided as a synonym for C<tr>.  If the
 SEARCHLIST is delimited by bracketing quotes, the REPLACEMENTLIST has
 its own pair of quotes, which may or may not be bracketing quotes,
-e.g., C<tr[A-Z][a-z]> or C<tr(+-*/)/ABCD/>.
+e.g., C<tr[A-Z][a-z]> or C<tr(+\-*/)/ABCD/>.
 
 Options:
 
@@ -944,7 +981,7 @@ by SEARCHLIST not found in REPLACEMENTLIST are deleted.  (Note
 that this is slightly more flexible than the behavior of some B<tr>
 programs, which delete anything they find in the SEARCHLIST, period.)
 If the C</s> modifier is specified, sequences of characters that were
-translated to the same character are squashed down to a single instance of the
+transliterated to the same character are squashed down to a single instance of the
 character.
 
 If the C</d> modifier is used, the REPLACEMENTLIST is always interpreted
@@ -973,13 +1010,13 @@ Examples:
     tr [\200-\377]
        [\000-\177];            # delete 8th bit
 
-If multiple translations are given for a character, only the first one is used:
+If multiple transliterations are given for a character, only the first one is used:
 
     tr/AAA/XYZ/
 
-will translate any A to X.
+will transliterate any A to X.
 
-Note that because the translation table is built at compile time, neither
+Note that 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():
@@ -1053,7 +1090,7 @@ of filenames.  The loop
 
 is equivalent to the following Perl-like pseudo code:
 
-    unshift(@ARGV, '-') if $#ARGV < $[;
+    unshift(@ARGV, '-') unless @ARGV;
     while ($ARGV = shift) {
        open(ARGV, $ARGV);
        while (<ARGV>) {
@@ -1180,6 +1217,34 @@ the compiler will precompute the number that
 expression represents so that the interpreter
 won't have to.
 
+=head2 Bitwise String Operators
+
+Bitstrings of any size may be manipulated by the bitwise operators
+(C<~ | & ^>).
+
+If the operands to a binary bitwise op are strings of different sizes,
+B<or> and B<xor> ops will act as if the shorter operand had additional
+zero bits on the right, while the B<and> op will act as if the longer
+operand were truncated to the length of the shorter.
+
+    # 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, you should be certain that
+you're supplying bitstrings: If an operand is a number, that will imply
+a B<numeric> bitwise operation. You may explicitly show which type of
+operation you intend by using C<""> or C<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
 
 =head2 Integer Arithmetic
 
@@ -1197,7 +1262,8 @@ countermand this by saying
 which lasts until the end of that BLOCK.
 
 The bitwise operators ("&", "|", "^", "~", "<<", and ">>") always
-produce integral results.  However, C<use integer> still has meaning
+produce integral results.  (But see also L<Bitwise String Operators>.)
+However, C<use integer> still has meaning
 for them.  By default, their results are interpreted as unsigned
 integers.  However, if C<use integer> is in effect, their results are
 interpreted as signed integers.  For example, C<~0> usually evaluates