URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9215
[ Назад ]

Исходное сообщение
"Проверка: определена ли переменная?"

Отправлено breeze , 07-Авг-11 14:31 
Добрый день.

Есть скрипт:

#!/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


Содержание

Сообщения в этом обсуждении
"Проверка: определена ли переменная?"
Отправлено breeze , 07-Авг-11 14:49 
Ответ уже сам нашел…

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';
}


"Проверка: определена ли переменная?"
Отправлено XoRe , 07-Авг-11 23:50 
Для ключей хеша ещё есть проверка на if(exists $hash{key})

"Проверка: определена ли переменная?"
Отправлено cirus , 10-Авг-11 01:21 
Натуральный быдлокод.



"Проверка: определена ли переменная?"
Отправлено anonymous , 14-Авг-11 19:40 
> Натуральный быдлокод.

А как правильно?


"Проверка: определена ли переменная?"
Отправлено cirus , 03-Сен-11 02:11 
Правильно не делать еще одну безполезную функцию. Есть defined и его достаточно.



"Проверка: определена ли переменная?"
Отправлено serg_56 , 15-Сен-11 16:59 
> Правильно не делать еще одну безполезную функцию. Есть defined и его достаточно.

товарищ просто проверял как работает if, а if от 0 дает false, потому и получилось как получилось.



"Проверка: определена ли переменная?"
Отправлено cirus , 17-Сен-11 00:06 
Извиняюсь. Действительно не понял авторского замысла. Но все равно пара замечаний.

Во-первых, совершенно не понятно из чего исходил автор, когда давал имя функции isDef. Проверяет она на истина/ложь, а не на определено/не_определено. Эта неточность влечет неверные выводы в дальнейших рассуждениях.

Во-вторых, Perl мы любим за краткость:
sub isTrue { shift ? 'true' : 'false' }