簡體   English   中英

為什么簡單異或在 Perl 中不起作用?

[英]Why is simple XOR not working in Perl?

my $list = "1 3";
my @arr  = split " ", $list;
my $c    = $arr[0] ^ $arr[1];
print $c, "\n";

上面給出了一個不正常的字符。

它應該給出答案 2,因為 1 XOR 3 是 2。

^考慮其操作數的內部存儲格式以確定要執行的操作。

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

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

后者xrs字符串的每個字符。

>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

這里有兩個問題:

  • $c1$c2在開始時未定義。
  • 他們是字符串。

(我假設有一點缺失,這樣'c1'和'c2'被提取為列表的第一個/最后一個元素,分別為1和3)

嘗試:

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

int函數顯式轉換為數值。

Perl v5.26 具有在按位運算符上強制使用數字上下文的功能:

use v5.26;
use feature qw(bitwise);

my $list = "1 3";
my @arr  = split " ", $list;
my $c    = $arr[0] ^ $arr[1];
print $c, "\n";

隨着時間的推移,perl 已經改變/改進了它對按位字符串操作的處理。

答案並不簡單,perl中有數字和按位異或運算。我會推薦你參考手冊的按位字符串運算符部分。 請注意他們現在如何嘗試通過使用“按位”功能來解決這種“不可預測的行為”,Perl 5.22 中的新功能/實驗性功能,Perl 5.28 中的穩定功能(請參閱 brian d foy 的文章Make bitwise operators always use numeric context ,他在下面的評論)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM