Добрый день.Есть скрипт:
#!/usr/bin/perl
use utf8;
use warnings;
use strict;my $var1;
my $var2 = "0";
my $var3 = 0;
my $var4 = "a";print isDef($var1)."\n";
print isDef($var2)."\n";
print isDef($var3)."\n";
print isDef($var4)."\n";sub isDef {
if (shift) {
return "true";
} else {
return "false";
}
}После выполнения получаем результат:
./test.pl
false
false
false
trueПервая переменная действительно не определена, но почему вторая и третья тоже?
p.s. Perl v5.14.1 built for i386-freebsd-thread-multi-64int
Ответ уже сам нашел…A simple Boolean test will not distinguish among undef, zero, the empty string, and "0" , which are all equally false.
Если кому интересно, решение работает:
sub isDef {
return (defined shift) ? 'true' : 'false';
}
Для ключей хеша ещё есть проверка на if(exists $hash{key})
Натуральный быдлокод.
> Натуральный быдлокод.А как правильно?
Правильно не делать еще одну безполезную функцию. Есть defined и его достаточно.
> Правильно не делать еще одну безполезную функцию. Есть defined и его достаточно.товарищ просто проверял как работает if, а if от 0 дает false, потому и получилось как получилось.
Извиняюсь. Действительно не понял авторского замысла. Но все равно пара замечаний.Во-первых, совершенно не понятно из чего исходил автор, когда давал имя функции isDef. Проверяет она на истина/ложь, а не на определено/не_определено. Эта неточность влечет неверные выводы в дальнейших рассуждениях.
Во-вторых, Perl мы любим за краткость:
sub isTrue { shift ? 'true' : 'false' }