my $list = "1 3";
my @arr = split " ", $list;
my $c = $arr[0]^$arr[1];
print $c, "\n";
上面給出了一個異常字符。爲什麼簡單的XOR不能在Perl中工作?
它應該給答案爲2時,因爲1個XOR 3是2。
my $list = "1 3";
my @arr = split " ", $list;
my $c = $arr[0]^$arr[1];
print $c, "\n";
上面給出了一個異常字符。爲什麼簡單的XOR不能在Perl中工作?
它應該給答案爲2時,因爲1個XOR 3是2。
^
認爲其操作數的內部存儲格式來確定要執行的動作。
>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
通過執行算術運算來進行投射投射有什麼特別的優點,而不是用明確的例如'INT()'? – Sobrique 2014-08-27 14:33:42
@Sobrique,它們都是顯式使用的數學運算,它們隱式地用於返回一個數字。 '0 + $ _'是更普遍的用途 - 它適用於所有數字,而'int($ _)'只適用於整數(在這種情況下,這是足夠的)。 – ikegami 2014-08-27 14:36:23
@Sobrique,除了在更多的情況下工作,'0+'是overload.pm使用的符號,它與'「」.'並行用於字符串化。 – ikegami 2014-08-27 14:51:25
兩個問題在這裏:
$c1
和$c2
在一開始是不確定的。(我假設有一個有點缺失,使得「C1」和「C2」得到提取作爲列表的第一/最後一個元素,1和3分別)
嘗試:
$list="1 2 3";
@arr=split(" ",$list);
$c=int($arr[0])^int($arr[2]);
print "$c";
int
函數顯式轉換爲數值。
您正在將數組分割爲'@ arr',但後來試圖操作'$ c1','$ c2','$ c'。這是行不通的。此外,你正在嘗試對字符串進行按位操作。您正嘗試對字符串「1」進行異或運算,而不是數字1. – Sobrique 2014-08-27 14:12:15