2017-01-20 9 views
1

Возвращаемое значение 5> 6 равно undef. Однако, когда я присваиваю значение 5> 6 переменной, которая определена. Как передать значение инструкции с помощью оператора сравнения, который разрешает undef при ошибке?Значение undef, присвоенное переменной.

#!/usr/bin/perl 
use strict ; 
use warnings; 
print'Five is more than six ? ',  5 > 6, "\n"; 
print 'Five is less than six ? ' , 5 < 6 , "\n"; 
my $wiz = 5 > 6 ; 

if (defined($wiz)) { 
    print '$wiz is defined' ; 
    } else { 
    print '$wiz is undefined' ; 
} 


$ ./lessthan 
Five is more than six ? 
Five is less than six ? 1 
$wiz is defined 

ответ

4

Как передать значение инструкции с помощью оператора сравнения, который разрешает undef при сбое?

В общем, Perl не обещает вернуть какое-либо конкретное истинное или ложное значение своим операторам, а < не является исключением. Если вы хотите, чтобы определенные значения, то вам нужно что-то вроде

$boolean ? $value_for_true : $value_for_false 

так

my $wiz = 5 > 6 ? 1 : undef; 

Если вы заботитесь только о том, какое значение вы получаете за ложь, вы можете также использовать следующие:

my $wiz = 5 > 6 || undef; 

Эти два варианта оказываются эквивалентными, но это не гарантируется.


Возвращаемое значение 5> 6 является UNDEF. Однако, когда я присваиваю значение 5> 6 переменной

Это неправда. Переменной присваивается определенное значение, потому что 5 > 6 оценивается до определенного значения. Хотя Perl не указывает, какое ложное значение оно возвращает из своих операторов, оно обычно возвращает скаляр sv_no, который является двойным символом, который представляется пустой строкой, когда рассматривается как строка, и ноль, когда рассматривается как число.

$ perl -wE'say "> ", "".(undef)' 
Use of uninitialized value in concatenation (.) or string at -e line 1. 
> 

$ perl -wE'say "> ", "".("")' 
> 

$ perl -wE'say "> ", "".(0)' 
> 0 

$ perl -wE'say "> ", "".(5>6)' 
>          # Behaves as "" 

$ perl -wE'say "> ", 0+(undef)' 
Use of uninitialized value in addition (+) at -e line 1. 
> 0 

$ perl -wE'say "> ", 0+("")' 
Argument "" isn't numeric in addition (+) at -e line 1. 
> 0 

$ perl -wE'say "> ", 0+(0)' 
> 0 

$ perl -wE'say "> ", 0+(5>6)' 
> 0         # Behaves as 0 
4

5 > 6 не определен, но это ложное значение. В этом случае используется dualvar, который используется как пустая строка при использовании в качестве строки или 0 при использовании в качестве номера.

Поскольку значение является ложным, вы можете просто сделать

if ($wiz) { ... } 

Если вы действительно хотите $wiz быть неопределенными, вы могли бы сделать что-то вроде этого.

my $wiz = 5 > 6 || undef; 

Теперь, если выражение 5 > 6 верно, $wiz будет 1, в противном случае это будет undef.

+1

Это не пустая строка, это двойная карта. Он действует как пустая строка, когда используется как строка, и ноль при использовании в качестве числа. См. Http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood и http://perldoc.perl.org/perlop.html#Relational-Operators – ThisSuitIsBlackNot

+0

Таким образом, чем меньше или больше оператора разрешается до 1 на успешном и «ложном» при неудаче, который является пустой строкой, а не undef. – capser

+0

Я просто вижу, что результат с 5> 6 ничто, или undef. Поэтому, если я назначу результат 5> 6 переменной, вы можете подумать, что результат 5> 6, который не определен, будет назначен для переменной. Однако, назначив это переменной - вы ее определяете. – capser

-1

Логическое ложь и UNDEF две разные вещи ...

сравнения задания выполняются в логическом контексте возвращает только только логические значения и UNDEF не булево вещь CHK это

if(defined false){ 
    print "false is also defined thing.." 
}else{ 
    print "else .." 
} 

Итак, вернемся к вопросу, кажется, сравнений не может вернуться UNDEF