X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlop.pod;h=483a686ebb65be5be867b08ace232fdb4f027711;hb=a2bdc9a53b6d7221bdf979c28003d54de36d16e5;hp=574e9238d8bcc987ffc12c00fde3dd67d89407bf;hpb=748a93069b3d16374a9859d1456065dd3ae11394;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlop.pod b/pod/perlop.pod index 574e923..483a686 100644 --- a/pod/perlop.pod +++ b/pod/perlop.pod @@ -8,7 +8,8 @@ Perl operators have the following associativity and precedence, listed from highest precedence to lowest. Note that all 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.) +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 -> @@ -31,13 +32,13 @@ Perl easier for C folks.) right = += -= *= etc. left , => nonassoc list operators (rightward) - left not + right not left and left or xor In the following sections, these operators are covered in precedence order. -=head1 DESCRIPTIONS +=head1 DESCRIPTION =head2 Terms and List Operators (Leftward) @@ -88,7 +89,7 @@ well as subroutine and method calls, and the anonymous constructors C<[]> and C<{}>. See also L toward the end of this section, -as well as L. +as well as L<"I/O Operators">. =head2 The Arrow Operator @@ -127,7 +128,9 @@ The autodecrement operator is not magical. =head2 Exponentiation Binary "**" is the exponentiation operator. Note that it binds even more -tightly than unary minus, so -2**4 is -(2**4), not (-2)**4. +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.) =head2 Symbolic Unary Operators @@ -155,17 +158,17 @@ thing from interpretation. =head2 Binding Operators -Binary "=~" binds an 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 $_. 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 time. This is less efficient -than an explicit search, since the pattern must be compiled every time -the expression is evaluated--unless you've used C.) +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 +$_. 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 +time. This is less efficient than an explicit search, since the pattern +must be compiled every time the expression is evaluated--unless you've +used C.) Binary "!~" is just like "=~" except the return value is negated in the logical sense. @@ -381,7 +384,7 @@ As a list operator: @foo = @foo[$#foo-4 .. $#foo]; # slice last 5 items The range operator (in a list context) makes use of the magical -autoincrement algorithm if the operaands are strings. You +autoincrement algorithm if the operands are strings. You can say @alphabet = ('A' .. 'Z'); @@ -404,17 +407,26 @@ specified. 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. Scalar or list context propagates downward into the 2nd -or 3rd argument, whichever is selected. The operator may be assigned -to if both the 2nd and 3rd arguments are legal lvalues (meaning that you -can assign to them): +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. + + $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; -Note that this is not guaranteed to contribute to the readability of -your program. +This is not necessarily guaranteed to contribute to the readability of your program. -=head2 Assigment Operators +=head2 Assignment Operators "=" is the ordinary assignment operator. @@ -463,8 +475,9 @@ argument and returns that value. This is just like C's comma operator. In a list context, it's just the list argument separator, and inserts both its arguments into the list. -The => digraph is simply a synonym for the comma operator. It's useful -for documenting arguments that come in pairs. +The => digraph is mostly just a synonym for the comma operator. It's useful for +documenting arguments that come in pairs. As of release 5.001, it also forces +any word to the left of it to be interpreted as a string. =head2 List Operators (Rightward) @@ -542,14 +555,13 @@ the same character fore and aft, but the 4 sorts of brackets s{}{} Substitution yes tr{}{} Translation no -For constructs that do interpolation, variables beginning with "C<$> or "C<@>" +For constructs that do interpolation, variables beginning with "C<$>" or "C<@>" are interpolated, as are the following sequences: \t tab \n newline \r return \f form feed - \v vertical tab, whatever that is \b backspace \a alarm (bell) \e escape @@ -574,6 +586,11 @@ particular, contrary to the expectations of shell programmers, backquotes do I interpolate within double quotes, nor do single quotes impede evaluation of variables when used within double quotes. +=head2 Regexp Quotelike Operators + +Here are the quotelike operators that apply to pattern +matching and related activities. + =over 8 =item ?PATTERN? @@ -622,8 +639,8 @@ interpolating won't change over the life of the script. However, mentioning C 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 most recently executed -(and successfully compiled) regular expression is used instead. +If the PATTERN evaluates to a null string, the last +successfully executed 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 @@ -745,7 +762,7 @@ 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 only want the pattern compiled once the first time the variable is interpolated, use the C option. If the pattern -evaluates to a null string, the most recently executed (and successfully compiled) regular +evaluates to a null string, the last successfully executed regular expression is used instead. See L for further explanation on these. Options are: @@ -797,9 +814,9 @@ Examples: # Delete C comments. $program =~ s { - /\* (?# Match the opening delimiter.) - .*? (?# Match a minimal number of characters.) - \*/ (?# Match the closing delimiter.) + /\* # Match the opening delimiter. + .*? # Match a minimal number of characters. + \*/ # Match the closing delimiter. } []gsx; s/^\s*(.*?)\s*$/$1/; # trim white space @@ -911,7 +928,9 @@ of C<$?>). Unlike in B, 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 $ through to the shell you need to hide it with a backslash. -The generalized form of backticks is C. +The generalized form of backticks is C. (Because backticks +always undergo shell expansion as well, see L for +security concerns.) Evaluating a filehandle in angle brackets yields the next line from that file (newline included, so it's never false until end of file, at @@ -934,17 +953,17 @@ The filehandles STDIN, STDOUT and STDERR are predefined. (The filehandles C, C and C 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. +function. See L for details on this. If a is used in a context that is looking for a list, a list consisting of all the input lines is returned, one line per list element. It's easy to make a I data space this way, so use with care. -The null filehandle <> is special and can be used to emulate the -behavior of B and B. Input from <> comes either from +The null filehandle EE is special and can be used to emulate the +behavior of B and B. Input from EE 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 +how it works: the first time EE is evaluated, the @ARGV array is checked, and if it is null, C<$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 @@ -965,11 +984,11 @@ is equivalent to the following Perl-like pseudo code: except that it isn't so cumbersome to say, and will actually work. It really does shift array @ARGV and put the current filename into variable -$ARGV. It also uses filehandle I internally--<> is just a synonym +$ARGV. It also uses filehandle I internally--EE is just a synonym for , which is magical. (The pseudo code above doesn't work because it treats as non-magical.) -You can modify @ARGV before the first <> as long as the array ends up +You can modify @ARGV before the first EE as long as the array ends up containing the list of filenames you really want. Line numbers (C<$.>) continue as if the input were one big happy file. (But see example under eof() for how to reset line numbers on each file.) @@ -989,23 +1008,28 @@ Getopts modules or put a loop on the front like this: ... # code for each line } -The <> symbol will return FALSE only once. If you call it again after +The EE symbol will return FALSE 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 input from STDIN. If the string inside the angle brackets is a reference to a scalar variable (e.g. <$foo>), then that variable contains the name of the -filehandle to input from. - -If the string inside angle brackets is not a filehandle, 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. One level of $ interpretation is done first, but you can't -say C$fooE> because that's an indirect filehandle as explained in the -previous paragraph. You could insert curly brackets to force -interpretation as a filename glob: C${foo}E>. (Alternately, you can -call the internal function directly as C, which is probably -the right way to have done it in the first place.) Example: +filehandle to input from, or a reference to the same. For example: + + $fh = \*STDIN; + $line = <$fh>; + +If the string inside angle brackets is not a filehandle or a scalar +variable containing a filehandle name or reference, then 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. One level of +$ interpretation is done first, but you can't say C$fooE> +because that's an indirect filehandle as explained in the previous +paragraph. In older version of Perl, programmers would insert curly +brackets to force interpretation as a filename glob: C${foo}E>. +These days, it's considered cleaner to call the internal function directly +as C, which is probably the right way to have done it in the +first place.) Example: while (<*.c>) { chmod 0644, $_; @@ -1030,6 +1054,30 @@ and just do your own grep() on the filenames. Furthermore, due to its current implementation of using a shell, the glob() routine may get "Arg list too long" errors (unless you've installed tcsh(1L) as F). +A glob only evaluates its (embedded) argument when it is starting a new +list. All values must be read before it will start over. In a list +context this isn't important, because you automatically get them all +anyway. In a scalar context, however, the operator returns the next value +each time it is called, or a FALSE value if you've just run out. Again, +FALSE is returned only once. So if you're expecting a single value from +a glob, it is much better to say + + ($file) = ; + +than + + $file = ; + +because the latter will alternate between returning a filename and +returning FALSE. + +It 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 notatin. + + @files = glob("$dir/*.[ch]"); + @files = glob($files[$i]); + =head2 Constant Folding Like C, Perl does a certain amount of expression evaluation at