为什么简单XOR在Perl中不起作用?

gblwokeq  于 2023-03-03  发布在  Perl
关注(0)|答案(4)|浏览(165)
my $list = "1 3";
my @arr  = split " ", $list;
my $c    = $arr[0] ^ $arr[1];
print $c, "\n";

以上是给出一个不正常的字符。
由于1 XOR 3等于2,因此应给予答案2。

z4bn682m

z4bn682m1#

[* use feature qw( bitwise );和类似(例如use v5.28;)的影响不在此答案范围内,因为在编写时不存在。*]
^考虑其操作数的内部存储格式来确定要执行的操作。

>perl -Mv5.14 -e"say( 1^3 )"
2

>perl -Mv5.14 -e"say( '1'^'3' )"
☻

后者对字符串中的每个字符进行异或运算。

>perl -Mv5.14 -e"say( chr( ord('1')^ord('3') ) )"
☻

可以通过添加零来强制数值化。

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

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

从技术上讲,您只需要将其中一个操作数设为数值。

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

>perl -Mv5.14 -e"@a = split(' ', '1 3'); say( $a[0]^(0+$a[1]) )"
2
dddzy1tm

dddzy1tm2#

这里有两个问题:

  • $c1$c2在开始时未定义。
  • 它们是线。

(我假设有一点缺失,比如'c1'和'c2'被提取为列表的第一个/最后一个元素,分别为1和3)
试试看:

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

int函数显式转换为数值。

qlfbtfca

qlfbtfca3#

Perl v5.26具有force numeric context on the bitwise operators的一个特性:

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

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

ifsvaxew4#

随着时间的推移,perl已经改变/改进了它对按位字符串操作的处理。
答案并不简单,perl中有数字和按位异或运算,我将推荐您参考手册的按位字符串运算符部分,注意他们现在是如何尝试使用“按位”特性来解决这种“不可预测的行为”的,这是Perl 5.22中的新特性/实验特性。在Perl 5.28中是稳定的(参见brian d foy在下面的评论中提到的文章Make bitwise operators always use numeric context)。

相关问题