我是perl的新手,我想知道为什么参数没有正确地传递给子程序。 此外,输出值是否正确?
use strict;
sub crc16 {
use constant POLY => $_[1];
my $crc = 0;
for my $c ( unpack 'C*', $_[0] ) {
$crc ^= $c;
for my $b ( 0 .. 7 ) {
my $carry = $crc & 1;
$crc >>= 1;
if( $carry ) {
$crc ^= POLY;
}
}
}
return $crc;
}
my $data = "1234";
my $poly = "0x8005";
printf "crc: %04x\n", crc16( $data, $poly );
谢谢!
答案 0 :(得分:2)
use ...
语句始终在编译时执行,并且不受正常控制流的约束。在编译期间,@_
数组不包含元素,因此$_[1]
将是未定义的。你应该使用常规变量:
sub crc16 {
my ($string, $poly) = @_;
my $crc = 0;
for my $c ( unpack 'C*', $string ) {
$crc ^= $c;
for ( 0 .. 7 ) {
my $carry = $crc & 1;
$crc >>= 1;
$crc ^= $poly if $carry;
}
}
return $crc;
}
哦,您应该将$poly
指定为整数,而不是字符串:$poly = 0x8005
,不带引号。
正如我在你的类似问题的评论中指出的那样,已经存在一个实现CRC算法的Perl模块:Digest::CRC
。重要部分用C编码以提高性能。提供的功能可高度参数化。我恳请你找到一种方法来使用该模块而不是重新发明轮子。