Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > true или false по строкам ;)


Автор: Materium 29.12.2006, 15:27
Как вы думаете, что выведет следующий скрипт:

Код

$a="0.00" + 0;
$b=\$a;
   if ($b) {
print "true";
   } else {
print "false";
   }


и почему?

Автор: nitr 30.12.2006, 00:50
Ссылка на скаляр есть не нуль smile

Добавлено @ 00:52 
Но неверно задано, не что возвращает, а что выведет эта программа smile

Добавлено @ 00:53 
Materium, причём тут CGI-программирование?

Автор: Materium 30.12.2006, 14:37
Верно я уже када создал всё это понял. Что не то написал и не там. ))) пусть Короб2001 переведёт.
nitr а без ссылки что выведет?

Автор: korob2001 30.12.2006, 15:50
Код

# В следующей строке, переменная $a содержит значение false (0), так как Perl преобразует
# сначала строку "0.00" в число, лишние нули отбрасываются в итоге получается выражение $a = 0 + 0
$a="0.00" + 0;

# Создаём ссылку на скаляр, переменная $b теперь содержит тип сылки и адрес в памяти, по которому 
# хранитсы ложное значение. Выглядит это примерно так: SCALAR(0x225c5c), что не равно false.
$b=\$a;


if ($b) {
   print "true";  # вывод делает именно этот print
} else {
   print "false";
}

Автор: Materium 30.12.2006, 17:15
С монстрами Perl тяжело спорить, я конечно эти примеры беру не от того что пока вумный, а из кэмэла Лари.
Но Короб маленькая загвоздка кажется всё же появилась. ;)))
Дело в том что "0.00" не является false, это не нулевая строка. По крайней мере кэмэл Лари 3 издание описывает Perl 5.6, может в других реализациях будет иначе, хотя думается вряд ли. Я на практике примерчик не проверял, проверю сегодня обязательно. "0.00" должно быть true, как он пишет!!!
Код

выражение $a="0.00" + 0; 

является false из-за приведения к сложению, только поэтому "0.00" преобразуется в число.
без + 0; строка должна быть true!
Ссылка хранит адрес переменной поэтому конечно true

Добавлено @ 17:16 
Хотя может быть ты это и имел виду выше

Автор: korob2001 30.12.2006, 17:31
Цитата(Materium @  30.12.2006,  14:15 Найти цитируемый пост)

Дело в том что "0.00" не является false, это не нулевая строка

Абсолютно верно, но читай коментарии и увидешь как это true, быстро преобразовывается в false.

Цитата(korob2001 @  30.12.2006,  12:50 Найти цитируемый пост)
# сначала строку "0.00" в число, лишние нули отбрасываются в итоге получается выражение $a = 0 + 0


PS: без + 0 строка так и осталась бы строкой.



Автор: nitr 30.12.2006, 17:52
Materium, вот тебе простейший пример smile)) Это я и имел ввиду smile
Код

#!perl
$a=0;
if($a) {
    print "is true\n";
} else {
    print "is false\n";
}
$b=\$a;
if($b) {
    print "is true\n";
} else {
    print "is false\n";
}

;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)