Все задачи

Истина--ложь, ноль--не ноль

17 Feb 2014

Начинающий программист хотел разобраться, какие значения 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

Подсказка-2

Показать

Но:

check_value();
defined
false
zero

Подсказка-3

Показать

Значение, которое передается в функцию и значение, которое функция получает – всегда ли это одно и то же?

Разоблачение

Показать

Проблема в строке

my $var = @_;

В скалярном контексте массив @_ вычисляется в количество его элементов, и в переменную $var попадает значение 1, независимо от переданных аргументов.

Правильно было бы так:

my $var = shift;

или

my ($var) = @_;

Самое точное и подробное объяснение проблемы прислал наш читатель Дмитрий Ольшевский. Здорово!