2014-08-27 59 views
3
my $list = "1 3"; 
my @arr = split " ", $list; 
my $c = $arr[0]^$arr[1]; 
print $c, "\n"; 

上面給出了一個異常字符。爲什麼簡單的XOR不能在Perl中工作?

它應該給答案爲2時,因爲1個XOR 3是2。

+2

您正在將數組分割爲'@ arr',但後來試圖操作'$ c1','$ c2','$ c'。這是行不通的。此外,你正在嘗試對字符串進行按位操作。您正嘗試對字符串「1」進行異或運算,而不是數字1. – Sobrique 2014-08-27 14:12:15

回答

8

^認爲其操作數的內部存儲格式來確定要執行的動作。

>perl -E"say(1^3)" 
2 

>perl -E"say('1'^'3')" 
☻ 

後者xors字符串的每個字符。

>perl -E"say(chr(ord('1')^ord('3')))" 
☻ 

您可以通過加零來強制數字化。

>perl -E"@a = split(' ', '1 3'); say((0+$a[0])^(0+$a[1]))" 
2 

>perl -E"@a = map 0+$_, split(' ', '1 3'); say($a[0]^$a[1])" 
2 

從技術上講,您只需要使其中一個操作數爲數字。

>perl -E"@a = split(' ', '1 3'); say((0+$a[0])^$a[1])" 
2 

>perl -E"@a = split(' ', '1 3'); say($a[0]^(0+$a[1]))" 
2 
+0

通過執行算術運算來進行投射投射有什麼特別的優點,而不是用明確的例如'INT()'? – Sobrique 2014-08-27 14:33:42

+0

@Sobrique,它們都是顯式使用的數學運算,它們隱式地用於返回一個數字。 '0 + $ _'是更普遍的用途 - 它適用於所有數字,而'int($ _)'只適用於整數(在這種情況下,這是足夠的)。 – ikegami 2014-08-27 14:36:23

+0

@Sobrique,除了在更多的情況下工作,'0+'是overload.pm使用的符號,它與'「」.'並行用於字符串化。 – ikegami 2014-08-27 14:51:25

2

兩個問題在這裏:

  • $c1$c2在一開始是不確定的。
  • 他們是字符串。

(我假設有一個有點缺失,使得「C1」和「C2」得到提取作爲列表的第一/最後一個元素,1和3分別)

嘗試:

$list="1 2 3"; 
@arr=split(" ",$list); 
$c=int($arr[0])^int($arr[2]); 
print "$c"; 

int函數顯式轉換爲數值。

相關問題