Что есть истина и ложь в Perl

В языке программирования Perl нет специальных значений, которые означают истину и ложь.

Любое значение Perl может интерпретировать как булево значение. Например, строка 'Hello' — это истина. Следующий код отобразит на экране строку 'true':

▶ Run
#!/usr/bin/perl

if ('Hello') {
    print 'true';
} else {
    print 'false';
}

Какие значения являются ложью

В языке программирования Perl есть 5 значений, которые являются ложью. Это:

  • undef
  • 0 — число 0
  • 0.0 — число 0.0
  • '' — пустая строка
  • '0' — строка 0

Вот пример кода, который показывает что все эти значения интерпретируются Perl как ложь. Код выведет на экран 5 раз слово 'false':

▶ Run
#!/usr/bin/perl

foreach my $val (undef, 0, 0.0, '', '0') {
    if ($val) {
        print "true\n";
    } else {
        print "false\n";
    }
}

Какие значения являются истиной

Истиной являются все значения, кроме тех 5, которые являются ложью.

Правило

Для того чтобы запомнить что является false можно использовать правило: "Все что 0 — это false, кроме '0 but true' строк".

Все эти 5 значений, которые являются false если их использовать как числа превращаются в 0. Вот код, который это подтверждает, код выведет на экран 5 нулей:

▶ Run
#!/usr/bin/perl

foreach my $val (undef, 0, 0.0, '', '0') {
    print $val + 0, "\n";
}

Правда, если использовать use strict; и use warnings; (что практически всегда стоит делать), то в случае undef и пустой строки Perl покажет предупреждения.

Вот код и результат его работы в случае undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = undef;

print $var + 0;
Use of uninitialized value $var in addition (+) at script.pl line 8.
0

А вот код и его результат в случае пустой строки:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = '';

print $var + 0;
Argument "" isn't numeric in addition (+) at script.pl line 8.
0

0 but true

В Perl существуют такие значения, которые в булевом контексте являются true, но при использовании в качестве числа превращаются в число ноль. Все такие значения — это строки.

Например, строка '0ASDF' — это как раз пример такого значения. При использовании как логическое значение эта строка будет интерпретирована как истина. Действительно, есть только 2 строки, которые являются ложью — пустая строка и строка в которой содержится только один символ — число ноль, строка '0ASDF' не является ни одной из этих двух строк, поэтому она не ложь, а истина.

Вот код, который показывает что строка '0ASDF' является истиной (код выведет на экран строку 'true'):

▶ Run
#!/usr/bin/perl

if ('0ASDF') {
    print 'true';
} else {
    print 'false';
}

При этом если эту же строку '0ASDF' использовать как число, то она будет интерпретирована как число 0 (правда, при включенных use strict;, use warnings; будет предупреждение):

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = '0ASDF';

print $var + 0;
Argument "0ASDF" isn't numeric in addition (+) at script.pl line 8.
0

Самое известное использование 0 but true значений происходит в Perl библиотеке DBI, там используется строка '0E0'.

Массив, Хеш, Ссылка

Массив является истиной если в нем есть хотя бы одно значение. Если же в массиве нет ни одного значения, то массив является ложью.

Точно так же, если в хеше есть хотя бы одна пара значений, то такой хеш является истиной. Если в хеше нет ни одной пары значений, то это ложь.

Ссылка — это всегда истина, не важно на что она ссылается. Даже ссылка на пустой массив [] или пустой хеш {} является истиной.

Один и пустая строка

Чаще всего для того чтобы написать в коде истину используется число один, а для того чтобы написать ложь используется число ноль.

Интересно, что сам Perl считает что каноническое значение для обозначения лжи это не число 0, а пустая строка ''.

Вот пример, который это показывает. Мы взяли строку 'Hello', которая является истиной и с помощью унарного оператор ! превратили ее в ложь:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

print Dumper !'Hello';

Результат — на экране появился текст $VAR1 = '';

Если же использовать оператор ! два раза, то мы получим каноническое значение для истины с точки зрения Perl:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

print Dumper !!'Hello';

(на экране появится текст $VAR1 = 1;).

Проблема читаемости

Чаще всего для того чтобы написать в коде истину используется число один, а для того чтобы написать ложь используется число ноль. Но, к сожалению, из этих чисел совершенно не ясно что это означает — число (и там могут быть другие числа), или же это флаг означающий истину.

Вот пример. Тут 1 для workers означает что нужно использовать один воркер (можно заменить на 10). А единица у log означает что логирование включено (и можно заменить только на 0, чтобы выключить):

my $config = {
    workers => 1,
    log => 1,
};

Другие статьи

Комментарии