Почему Perl считает -1 верным? - PullRequest
12 голосов
/ 03 октября 2011

Это обычный пример кода:

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

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

perl foo.pl
foo
foo
foo
...

и

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

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

perl test.pl

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

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

что дает

foo
foo
foo
...

Ответы [ 7 ]

19 голосов
/ 03 октября 2011

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

18 голосов
/ 03 октября 2011

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

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

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

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

if (@x)

вместо

if (@x != 0)
16 голосов
/ 03 октября 2011

От perldoc perlsyn (Правда и Ложь) :

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

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

4 голосов
/ 03 октября 2011

Вопрос «почему Perl считает -1 истинным?» .

Ответ: когда Perl был разработан, было решено, что некоторые значения будут оценены как ложные.Это:

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

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

4 голосов
/ 03 октября 2011

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

2 голосов
/ 03 октября 2011

любое целое число <> 0 истинно. 0 всегда ложно.

1 голос
/ 04 октября 2011

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

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

...