Настроение: | depressed |
Музыка: | Gong |
Range Operators
Я переписал ljsm.pl ati@lj таким образом, что
он сохраняет отдельный дневник (без комментариев),
и еще добавляет "n replies" в конец каждого сообщения.
Мой собственный дневник составил 4 мегабайта всего
(в старой версии было 17 мег).
Осталось накачать побольше дневников,
написать процедуру парсинга и склепать
из скачанного полноценную френд-ленту,
на память потомству.
Сегодня весь вечер читал документацию к
оператору .. излюбленному достойным ati@lj
и рыдал в голос. Ничего более запутанного
природа, кажется, не произвела. Вообще
Перл сродни России - грязь, куча непонятных
артефактов и никогда не знаешь, что
получится, пока не попробуешь.
Вот, в назидание потомству, описание ..
Трепещите.
Range Operators
Binary ".." is the range operator, which is really two different opera-
tors depending on the context. In list context, it returns an list of
values counting (up by ones) from the left value to the right value.
If the left value is greater than the right value then it returns the
empty array. The range operator is useful for writing "foreach
(1..10)" loops and for doing slice operations on arrays. In the current
implementation, no temporary array is created when the range operator
is used as the expression in "foreach" loops, but older versions of
Perl might burn a lot of memory when you write something like this:
for (1 .. 1_000_000) {
# code
}
The range operator also works on strings, using the magical auto-incre-
ment, see below.
In scalar context, ".." returns a boolean value. The operator is
bistable, like a flip-flop, and emulates the line-range (comma) opera-
tor 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, just use three dots ("...") instead of two. In
all other regards, "..." behaves just like ".." does.
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 empty 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 constant
expression, that operand is implicitly compared to the $. variable, the
current line number.
Особенно трогательна, конечно, фраза
"The precedence is a little lower than || and &&."
Стилистика, медам и месье, стилистика.
Привет
Миша.