0

我的工作场所不允许我们安装任何模块,因此该选项不适合我。因此决定查看此链接http://en.wikipedia.org/wiki/CUSIP并按照那里的伪代码并尝试在 Perl 中对其进行编码。

我想出了以下几点:

sub cusip_check_digit
{
    my $cusip = shift;                    ## Input: an 8-character CUSIP
    my $v = 0;                            ## numeric value of the digit c (below)

    my $sum = 0;
    for (my $i = 0; $i < 8; $i++)
    {
        my $c = substr ($cusip, $i, 1);   ## $c is the ith character of cusip          
        if ($c =~ /\d/)                   ## c is a digit then
        {
            $v = $c;                      ## numeric value of the digit c
        }
        elsif ($c =~ /\w/)
        {
            my $p = ord($c) - 64;         ##  ordinal position of c in the alphabet (A=1, B=2...)
            $v = $p + 9;
        }

        if (0 != $i % 2)                  ## check to see if $i is even (we invert due to Perl starting points)
        {
            $v = $v * 2;
        }

        $sum = $sum + int ($v / 10) + $v % 10;

    }

    $v = (10 - ($sum % 10)) % 10;
    print "v is: $v\n";

    #return (10 - ($sum % 10)) % 10
}

cusip_check_digit('90137F10');   ## should return 3 ** Now works **
cusip_check_digit('68243Q10');   ## should return 6 ** Now works **

不完全确定为什么它不起作用。

4

1 回答 1

2

我认为你的问题是这一行:

$sum = $sum + $v / 10 + $v % 10;

维基说“div”和“mod”。这意味着整数除法,这不是它在做什么。

将其更改为:

$sum = $sum + int ( $v / 10 ) + $v % 10;

你得到'3'的期望结果。我还没有用任何其他值检查它,所以你最好检查一下。

编辑:第二个问题是因为我们从 0 到 7 而不是像示例中那样从 1 到 8 运行。这意味着“i偶数”测试得到了错误的数字。通过反转逻辑很容易解决(测试“奇数”而不是“偶数”)。

将该位更改为:

if (0 != $i % 2) {
    $v = $v * 2;
}
于 2015-01-22T20:29:55.177 回答