[英]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.