Perl - Хорошая ли практика использовать пустую строку как false? - PullRequest
4 голосов
/ 07 июля 2010

Безопасно ли / полезно в Perl использовать пустую строку как false в логических сравнениях?

ex:

my $s = '';

if($s) {
 print 'true';
} else {
 print 'false';
}

или лучше использовать функцию длины:

my $s = '';

if(length($s) > 0) {
 print 'true';
} else {
 print 'false';
}

Ответы [ 2 ]

11 голосов
/ 07 июля 2010

При проверке истинности / ложности в выражении вы должны тщательно продумать, что вы на самом деле хотите проверить.

Если у вас есть строка и вам нужно проверить, имеет ли она какое-либо значение, тогдапроверить это:

if (defined $string) { ... }

Если вы возвращаете «логическое» значение из функции или тестируете результат какой-либо внутренней операции, выполните логическую проверку:

if ($value) { ... }

В Perl «истина» зависит от того, как она оценивается.Если вы просто скажете if ($value), то единственными значениями string , которые оцениваются как false, являются пустая строка '' и буквальный ноль '0'.(Кроме того, любое неопределенное значение является ложным, поэтому, если $value никогда не присваивается, это также будет ложным.)

Существуют и другие значения, которые могут принимать значение false в числовом контекст, например 0E0, 0.0000 и строка '0 but true'.Таким образом, вопрос «что есть истина» действительно зависит от контекста, о котором вы, программист, должны знать.

Внутренне Perl использует '' для ложного и 1 для правды (например, в качестверезультат любого логического выражения, такого как !$value).Обычный метод "канонизации" любого значения в одно из этих двух значений - !!$value - он дважды инвертирует значение, давая вам либо '', либо 1.

6 голосов
/ 07 июля 2010

Строка может иметь длину, но все равно быть ложной - в частности, строка '0' (подробности: Perl Truth and Falsehood ).По крайней мере, в общем случае, length не обеспечивает надежного теста на правду.

my $s = '0';

print "'0' is false.\n"      unless $s;
print "But it has length.\n" if length $s;

Как правило, вы должны использовать тест, характеризующий то, что вас действительно волнует.Например, если вы попросите пользователя ввести свой любимый возраст, '0' будет ложным, но верным ответом: «Мой первый год жизни был великолепным, а затем все пошло к черту».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...