Perl. Оператор диапазона
тоже интересно сталоЕсли так, то более-менее понятно, я то думал он в другом контексте(не в смысле скаляр/список может применяться
ссылка, где мужик сильно ругался на эту доку:
буквально вчера на лоре в комментах про перл проскочила
Range Operator
--------------
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[$[ .. $#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 autoincrement
algorithm if the operaands are strings. You can say
@alphabet = ('A' .. 'Z');
to get all the letters of the alphabet, or
$heigit = (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.
После прочтения как раз этого места и возник вопрос!
Оставить комментарий
wwoland
Дайте плз пример использования сабжа в скалярном контексте