我只用简单的一段代码就无法解决我的问题。我想要做的就是用L代替0,用H代替1来代替十六进制数字的二进制值。我需要从用户那里获取十六进制数字,将其转换为二进制,扫描二进制的每一位,然后用L替换0,用H替换1。简单的要求却很难解决。
use warnings;
use strict;
my $i2c = "80";
my $binary_string = sprintf "%08b", hex($i2c);
print "$binary_string \n";
my $charz = sprintf "%s", $binary_string;
print "$charz\n";
for (my $i=1; $i < @charz; $i++) {
if (substr($charz, $i) eq "0")
substr($charz, $i) = "L";
else if (substr($charz, $i) eq "1")
substr($charz, $i) = "H";
}
我的输出应该是这样的:
input hex = 80
因此二进制将是10000000
。所以我的输出必须是HLLLLLLL
。
我无法获得此简单输出。我尝试了各种各样的方法使其正常工作(正则表达式匹配并替换子字符串,索引等)。我不确定我是否在某个地方犯了基本错误。请帮助我解决这一问题。
我得到的错误是这样的:
syntax error at temp3.pl line 12, near ")
substr"
Execution of temp3.pl aborted due to compilation errors.
Perl的if
语句总是需要{
和}
周围的行动:
if (substr($charz, $i) eq "0")
{
substr($charz, $i) = "L";
}
else if (substr($charz, $i) eq "1")
{
substr($charz, $i) = "H";
}
(您可能还应该查看封闭的循环索引;除非您真的很想过着危险的生活,否则Perl中的数组索引从0开始索引。而且,正如TLP所评论的那样,在我们解构代码时,对$charz
via的赋值sprintf
是一种漫长的方法写作$charz = $binary_string;
!)
另外,正如hobbs在评论中指出的那样,substr()
操作员需要第三个参数才能按需工作:
if (substr($charz, $i, 1) eq "0")
{
substr($charz, $i, 1) = "L";
}
else if (substr($charz, $i, 1) eq "1")
{
substr($charz, $i, 1) = "H";
}
或者您可以使用:
substr($charz, $i, 1) = "L" if (substr($charz, $i, 1) eq "0");
substr($charz, $i, 1) = "H" if (substr($charz, $i, 1) eq "1");
或者,您可以避免显式循环并使用:
$charz =~ s/1/H/g;
$charz =~ s/0/L/g;
或者您可以使用:
$charz =~ y/01/LH/;
或者您可以将其拼写y
为tr
:
$charz =~ tr/01/LH/;
或您可以在Perl中完成的所有其他方式...
在所示的机制中,我将使用y
或tr
(可能tr
是首选;y
对于顽固的sed
程序员而言);或者 一口气做到了:没有大惊小怪,没有糊涂。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句