Perl实现按位非功能遇乱码问题求解:计算器开发技术问询
Perl实现按位非(bitwise NOT)的正确方式
你的问题出在输入处理上:<STDIN>读取的内容是包含换行符的字符串,而非纯整数。Perl对字符串执行按位非时,会逐个字符处理其ASCII码值,导致输出不可打印的乱码字符。
问题分析
当你输入5,<STDIN>实际读取到的是字符串"5\n"(末尾带换行符):
- 字符
'5'的ASCII码是53,~53的结果是-54,对应不可打印字符 - 换行符
'\n'的ASCII码是10,~10的结果是-11,同样是不可打印字符
两者组合输出就是你看到的乱码。
解决步骤
- 先去除输入字符串末尾的换行符(用
chomp) - 将字符串转换为整数(用
int或直接利用Perl的自动转换) - 再执行按位非操作
修正后的代码
my $val1 = <STDIN>; chomp $val1; # 移除末尾的换行符 $val1 = int($val1); # 确保转换为整数 print ~$val1, "\n";
或者更简洁的写法:
my $val1 = int(<STDIN>); # int会自动忽略换行符,直接提取整数部分 print ~$val1, "\n";
补充说明
Perl中按位非的结果是有符号整数的补码取反,公式为~x = -x -1。比如输入5,~5的结果是-6,这是符合预期的按位非运算结果。
如果需要处理非整数输入的情况,可以添加简单的验证:
my $val1 = <STDIN>; chomp $val1; if ($val1 !~ /^\d+$/) { print "请输入有效的整数\n"; exit; } $val1 = int($val1); print ~$val1, "\n";
内容的提问来源于stack exchange,提问作者sam_
相关产品推荐
相关产品推荐

