Начинающий программист хотел разобраться, какие значения perl считает опредленными, неопределенными, истинными, ложными, нулевыми и ненулевыми. Для этого он написал функцию, которя выводит на экран все характеристики переданного значения:
use feature qw/say/;
sub check_value
{
my $var = @_;
say defined $var ? "defined" : "undefined";
say $var ? "true" : "false";
say $var == 0 ? "zero" : "not a zero";
return;
}
Результаты вызова этой функции с разными параметрами очень удивили программиста…
Получалось так, что все значения – определенные, истинные, ненулевые.
check_value(0);
defined
true
not a zero
check_value('');
defined
true
not a zero
check_value(undef)
defined
true
not a zero
Но:
check_value();
defined
false
zero
Значение, которое передается в функцию и значение, которое функция получает – всегда ли это одно и то же?
Проблема в строке
my $var = @_;
В скалярном контексте массив @_
вычисляется в количество его элементов,
и в переменную $var
попадает значение 1
, независимо от переданных аргументов.
Правильно было бы так:
my $var = shift;
или
my ($var) = @_;
Самое точное и подробное объяснение проблемы прислал наш читатель Дмитрий Ольшевский. Здорово!