Как вы сказали, unpack("%16W*", $string)
дает вам целое число.Чтобы преобразовать целое число в шестнадцатеричное, используйте sprintf :
my $string = "this is my string";
my $expected = '0671';
my $checksum = sprintf('%04x', unpack("%16W*", $string));
print "match\n" if $checksum eq $expected;
Если вы хотите использовать шестнадцатеричные цифры в верхнем регистре, используйте %X
вместо %x
(или %04X
в этомcase).
Или вы можете пойти другим путем и преобразовать свою шестнадцатеричную контрольную сумму в целое число, используя hex :
my $string = "this is my string";
my $expected = '0671';
my $checksum = unpack("%16W*", $string);
print "match\n" if $checksum == hex $expected; # now using numeric equality