Подтвердить что ты не робот

Почему Perl думает -1 верно?

Это кусок общего примера кода:

while (1) { 
    print "foo\n"; 
}

который печатает "foo" навсегда.

perl foo.pl
foo
foo
foo
...

и

while (0) { print "foo\n"; } 

умирает тихо, как вы ожидаете:

perl test.pl

Может кто-нибудь объяснить, почему это полезная реализация? Это работает по 5.10, по крайней мере, Unix и MacOS X:

while (-1) { print "foo\n"; }

который дает

foo
foo
foo
...
4b9b3361

Ответ 1

Во всяком случае, можно сказать, что -1 более вероятно, будет истинным, чем 1, поскольку -1 (111..111b) является побитовым отрицанием нуля (000..000b). BASIC и GW-BASIC использовали -1, когда им нужно было вернуть истинное значение.

Независимо, Perl решил, что значения, которые означают "пусто" или "ничего", являются ложными. Большинство языков придерживаются аналогичной точки зрения. В частности, целые ноль, ноль с плавающей точкой, строка нуль, пустая строка и undef являются ложными.

Это документировано, хотя документация плохо сформулирована. (Он перечисляет () как значение, которое является ложным, но такого значения нет.)

Помимо последовательности, очень полезно использовать этот подход. Например, он позволяет использовать

if (@x)

вместо

if (@x != 0)

Ответ 2

Каждое ненулевое целое вычисляет значение true. И 0 всегда false

Ответ 3

Из perldoc perlsyn (Истина и Ложь):

Число 0, строки '0' и '', пустой список() и undef все ложные в булевом контексте. Все остальные значения верны.

-1 считается истинным.

Ответ 4

Только целое число 0 считается ложным. Любое другое ненулевое целое считается истинным.

Ответ 5

Вопрос: "Почему perl think -1 является истинным?".

Ответ: когда был разработан perl, было решено, что определенные значения будут оцениваться как false. Это:

  • 0
  • UNDEF
  • '' (пустая строка)

Это все, что я могу придумать для подходящего ответа на почему. Это было просто спроектировано именно так.

Ответ 6

истинно любое целое число &lt > 0. 0 всегда false.

Ответ 7

Perl принял это поведение от awk и C.

Почему C объясняется здесь.