my $list = "1 3"; my @arr = split " ", $list; my $c = $arr[0] ^ $arr[1]; print $c, "\n";
以上是给出一个不正常的字符。由于1 XOR 3等于2,因此应给予答案2。
z4bn682m1#
[* use feature qw( bitwise );和类似(例如use v5.28;)的影响不在此答案范围内,因为在编写时不存在。*]^考虑其操作数的内部存储格式来确定要执行的操作。
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
dddzy1tm2#
这里有两个问题:
$c1
$c2
(我假设有一点缺失,比如'c1'和'c2'被提取为列表的第一个/最后一个元素,分别为1和3)试试看:
$list="1 2 3"; @arr=split(" ",$list); $c=int($arr[0])^int($arr[2]); print "$c";
int函数显式转换为数值。
int
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";
ifsvaxew4#
随着时间的推移,perl已经改变/改进了它对按位字符串操作的处理。答案并不简单,perl中有数字和按位异或运算,我将推荐您参考手册的按位字符串运算符部分,注意他们现在是如何尝试使用“按位”特性来解决这种“不可预测的行为”的,这是Perl 5.22中的新特性/实验特性。在Perl 5.28中是稳定的(参见brian d foy在下面的评论中提到的文章Make bitwise operators always use numeric context)。
4条答案
按热度按时间z4bn682m1#
[*
use feature qw( bitwise );
和类似(例如use v5.28;
)的影响不在此答案范围内,因为在编写时不存在。*]^
考虑其操作数的内部存储格式来确定要执行的操作。后者对字符串中的每个字符进行异或运算。
可以通过添加零来强制数值化。
从技术上讲,您只需要将其中一个操作数设为数值。
dddzy1tm2#
这里有两个问题:
$c1
和$c2
在开始时未定义。(我假设有一点缺失,比如'c1'和'c2'被提取为列表的第一个/最后一个元素,分别为1和3)
试试看:
int
函数显式转换为数值。qlfbtfca3#
Perl v5.26具有force numeric context on the bitwise operators的一个特性:
ifsvaxew4#
随着时间的推移,perl已经改变/改进了它对按位字符串操作的处理。
答案并不简单,perl中有数字和按位异或运算,我将推荐您参考手册的按位字符串运算符部分,注意他们现在是如何尝试使用“按位”特性来解决这种“不可预测的行为”的,这是Perl 5.22中的新特性/实验特性。在Perl 5.28中是稳定的(参见brian d foy在下面的评论中提到的文章Make bitwise operators always use numeric context)。