Algorithm 有没有办法在Perl中检查CUSIP的数字

Algorithm 有没有办法在Perl中检查CUSIP的数字,algorithm,perl,financial,check-digit,Algorithm,Perl,Financial,Check Digit,我的工作场所不允许我们安装任何模块,因此该选项不适合我。所以决定查看这个链接,并遵循那里的伪代码,并尝试用Perl对其进行编码 我得出了以下结论: sub cusip_check_digit { my $cusip = shift; ## Input: an 8-character CUSIP my $v = 0; ## numeric value of the digit c (belo

我的工作场所不允许我们安装任何模块,因此该选项不适合我。所以决定查看这个链接,并遵循那里的伪代码,并尝试用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 **
sub-cusip\u校验位
{
我的$cusip=shift;##输入:一个8字符的cusip
my$v=0;##数字c的数值(如下)
我的$sum=0;
对于(我的$i=0;$i<8;$i++)
{
my$c=substr($cusip,$i,1);##$c是cusip的第i个字符
如果($c=~/\d/)##c是一个数字,那么
{
$v=$c;##数字c的数值
}
elsif($c=~/\w/)
{
我的$p=ord($c)-64;##字母表中c的顺序位置(A=1,B=2…)
$v=$p+9;
}
如果(0!=$i%2)##检查$i是否为偶数(由于Perl起点的原因,我们会反转)
{
$v=$v*2;
}
$sum=$sum+int($v/10)+$v%10;
}
$v=(10-($sum%10))%10;
打印“v is:$v\n”;
#回报率(10-($sum%10))%10
}
cusip校验位('90137F10');#应该返回3**现在可以工作了**
cusip_校验位('68243Q10');#应该返回6**现在可以工作了**

不太清楚它为什么不起作用。

我想你的问题在于这一行:

$sum = $sum + $v / 10 + $v % 10;
维基上写着“div”和“mod”。这意味着整数除法,但它不是这样做的

将其更改为:

$sum = $sum + int ( $v / 10 ) + $v % 10;
您将得到“3”的预期结果。我还没有用任何其他值检查它,所以你最好检查一下

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

将该位更改为:

if (0 != $i % 2) {
    $v = $v * 2;
}

我认为这不是问题所在。维基说1。。。我被纠正了。这是问题之一。非整数除法似乎是另一个。对奇偶校验和int()进行了建议的修改,现在函数可以工作了。谢谢大家的帮助。你不使用CPAN模块有什么特别的原因吗?当我处理这个问题时,我发现CUSIP至少有3个validation@DVK因为工作不允许我安装或下载桌面或服务器上没有的任何新模块。或者我肯定会使用其中一个。这对上面的示例很有帮助,但是当我尝试
cusip\u check\u digit('68243Q10')
时,它返回了5,而它本应该返回6。虽然越来越近了。嗯,可能是同样的问题,但是舍入误差/整数除数<代码>使用整数一开始可能是一个更优雅的解决方案。(但不会改变第二个示例中的结果)。啊,明白了-你测试的偶数/奇数不正确,因为你“步进”了范围-Wiki的范围是1..8这是0..7。这就成功了,我正在测试更多的内容。但是除了
int()
之外,这肯定是个问题。