为什么简单的XOR不能在Perl中运行?

时间:2014-08-27 14:09:22

标签: perl xor

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

以上是一个异常的角色。

它应该给出答案为2,因为1 XOR 3是2。

2 个答案:

答案 0 :(得分:9)

^会考虑其操作数的内部存储格式,以确定要执行的操作。

>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

答案 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函数显式转换为数值。