В Perl, в чем разница между «если определено $ count» и «если $ считать»? - PullRequest
12 голосов
/ 11 октября 2010

У меня есть следующий скрипт:

#!/usr/bin/perl
use warnings;
use strict;

my $count = 0; 
my ( @first , @second , @third );

while ($count <= 7){

    push ( @first , $count);
    push ( @second , $count) if defined $count;
    push ( @third , $count) if $count;
    $count++;

}

print "first: @first\n";
print "second: @second\n";
print "third: @third\n";

Это дает следующий вывод:

first: 0 1 2 3 4 5 6 7
second: 0 1 2 3 4 5 6 7
third: 1 2 3 4 5 6 7

В чем разница между положением if defined $count против if $count, кроме последнего метода, который не добавит ноль в массив? Я искал perldocs, но не смог найти ответ.

Ответы [ 6 ]

26 голосов
/ 11 октября 2010

Правда и Ложь в perlsyn объясняет, какие значения считаются ложными в логическом контексте:

Число 0, строки '0' и '', пустой список () и undef все ложно в логическом контексте. Все остальные значения верны.

undef - это значение переменной, которая никогда не была инициализирована (или была сброшена с помощью функции undef ). Функция defined возвращает true, если значение выражения не равно undef.

if $count - false, если $count - это число 0, строка '0', пустая строка undef или объект, который был перегружен для возврата одного из этих элементов при использовании в логическом контексте. В противном случае это правда. (Пустой список не может быть сохранен в скалярной переменной.)

if defined $count ложно, только если $count равно undef.

5 голосов
/ 11 октября 2010

Если вы видите документацию , определенную в perldoc, то вы обнаружите, что

  • Возвращает логическое значение, указывающее, имеет ли EXPR значение, отличное от неопределенного значенияUNDEF.Если EXPR отсутствует, проверяется $ _.

  • Простой логический тест не будет различать undef, ноль, пустую строку и "0", которые все являютсяв равной степени неверно .

, что означает

push ( @second , 'undef') if defined $count; 

при $count = 0, тогда оно определяется, поскольку 0 отличается от undef и определено возвращает значение true, но в этом случае push ( @third , 'undef') if $count; if condition завершается ошибкой, поэтому оно не помещает 0 в массив.

3 голосов
/ 11 октября 2010

if решает запустить свой блок (или отдельный оператор), посмотрев на значение выражения, которое вы ему даете:

 if( EXPR ) { ... }

Если это выражение истинно, он запускает свой блок.Если это выражение ложно, это не так.

Это выражение может быть чем угодно.Perl оценивает выражение, сводя его к значению true или false.if() затем смотрит на это значение.

Итак, удаляя эту часть вашего вопроса, вы остаетесь с «В чем разница между defined $count и $count».Ну, одно - это возвращаемое значение для определенного , а другое - любое значение, сохраненное в $count.

Когда вы хотите выяснить, что делает конкретный бит кода, уменьшитеэто в том же логическом процессе, что и perl, по одному шагу за раз.Посмотрите, что делает каждый шаг, и вы часто сможете ответить на свои вопросы.:)

Вы говорите, что искали документацию, но я не уверен, где вы смотрели.Если вы хотите посмотреть встроенную функцию, вы можете использовать переключатель -f perldoc:

 $ perldoc -f defined

Если вы хотите прочитать о синтаксисе Perl для таких вещей, как if, то это в perlsyn .

У меня есть руководство для начинающих по документации Perl в Документация по Perl .

2 голосов
/ 11 октября 2010

Предикат defined проверяет, определена ли вообще переменная ($count в этом случае).В коде, который вы написали, он всегда будет определен внутри цикла, потому что у него всегда есть какое-то значение.

Если бы вы добавили:

undef $count;
push ( @first , 'undef'); 
push ( @second , 'undef') if defined $count; 
push ( @third , 'undef') if $count; 

после цикла, вы быувидеть разницу.(Обратите внимание, что я изменил код, добавив литерал 'undef' вместо $count, потому что вы получите вводящие в заблуждение эффекты при добавлении фактического значения undef.

0 голосов
/ 15 октября 2010

Как и любой fule kno, «число 0, строки« 0 »и« », пустой список () и undef» не должны равняться ложному, поскольку они не являются логическими по своей природе. Написание кода, который опирается на это извращение, хотя и является технически правильным, вводит в заблуждение и должно быть категорически не рекомендуется. Как следует сорнякам и бабам.

0 голосов
/ 11 октября 2010

Как я читаю.

if $count имеет значение true, только когда $count оценивает != 0, следовательно, в третьем массиве нет 0.

if defined $count проверяет, был ли создан $count как скаляр, и, поскольку у вас есть $count скаляр, он такой же, как и первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...