2017-01-20 126 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 .." 
} 

所以回到問題,好像比較不能返回民主基金