2017-01-20 23 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是真实的,$wiz1,否则这将是undef

+1

这不是空字符串,它是一个双变量。它用作字符串时用作空字符串,用作数字时用作零。请参阅http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood和http://perldoc.perl.org/perlop.html#Relational-Operators – ThisSuitIsBlackNot

+0

因此,小于或大于运算符会解析为1在成功和“falsey”失败,这是一个空字符串,而不是undef。 – capser

+0

我只是看到结果关闭5> 6没有什么,或undef。因此,如果我将5> 6的结果赋予变量,你会认为5> 6的结果似乎没有被定义,但是通过赋值给变量 - 你可以定义它。 – capser

-1

布尔值false和民主基金是两回事......

比较分配在布尔上下文中执行只只返回布尔值和民主基金是不是布尔事 CHK这

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

所以回到问题,好像比较不能返回民主基金