Home
Search Perl pages
Subjects
By activity
Professions, Sciences, Humanities, Business, ...
User Interface
Text-based, GUI, Audio, Video, Keyboards, Mouse, Images,...
Text Strings
Conversions, tests, processing, manipulation,...
Math
Integer, Floating point, Matrix, Statistics, Boolean, ...
Processing
Algorithms, Memory, Process control, Debugging, ...
Stored Data
Data storage, Integrity, Encryption, Compression, ...
Communications
Networks, protocols, Interprocess, Remote, Client Server, ...
Hard World Timing, Calendar and Clock, Audio, Video, Printer, Controls...
File System
Management, Filtering, File & Directory access, Viewers, ...
|
|
|
Binary ``..'' is the range operator, which is really two different
operators depending on the context. In a list context, it returns an array
of values counting (by ones) from the left value to the right value. This
is useful for writing for (1..10) loops and for doing slice operations on arrays. Be aware that under the
current implementation, a temporary array is created, so you'll burn a lot
of memory if you write something like this:
for (1 .. 1_000_000) {
# code
}
In a 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), use three dots (``...'') instead of two.) 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 null 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 numeric literal, that operand is implicitly compared to the
$. variable, the current line number. Examples:
As a scalar operator:
if (101 .. 200) { print; } # print 2nd hundred lines
next line if (1 .. /^$/); # skip header lines
s/^/> / if (/^$/ .. eof()); # quote body
As a list operator:
for (101 .. 200) { print; } # print $_ 100 times
@foo = @foo[0 .. $#foo]; # an expensive no-op
@foo = @foo[$#foo-4 .. $#foo]; # slice last 5 items
The range operator (in a list context) makes use of the magical
auto-increment algorithm if the operands are strings. You can say
@alphabet = ('A' .. 'Z');
to get all the letters of the 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.
Source: Perl operators and precedence Copyright: Larry Wall, et al. |
Next: Conditional Operator
Previous: C-style Logical Or
(Corrections, notes, and links courtesy of RocketAware.com)
Up to: PERL
Rapid-Links:
Search | About | Comments | Submit Path: RocketAware > Perl >
perlop/Range_Operator.htm
RocketAware.com is a service of Mib Software Copyright 2000, Forrest J. Cavalier III. All Rights Reserved. We welcome submissions and comments
|