有没有办法在 Perl 中检查 CUSIP 的数字
Is there a way to check digits of a CUSIP in Perl
我的工作地点不允许我们安装任何模块,因此该选项不适合我。所以决定看看这个 link 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 **
不确定为什么它不起作用。
我认为你的问题是这一行:
$sum = $sum + $v / 10 + $v % 10;
维基说 'div' 和 'mod'。这意味着整数除法,而这不是它在做什么。
改为:
$sum = $sum + int ( $v / 10 ) + $v % 10;
你得到了想要的结果“3”。不过,我还没有用任何其他值检查过它,所以你最好检查一下。
编辑:第二个问题是因为我们 运行 从 0 到 7 而不是像示例中那样从 1 到 8。这意味着 'is i
even' test 得到了错误的数字。通过反转逻辑很容易解决(测试 'odd' 而不是 'even')。
将该位更改为:
if (0 != $i % 2) {
$v = $v * 2;
}
我的工作地点不允许我们安装任何模块,因此该选项不适合我。所以决定看看这个 link 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 **
不确定为什么它不起作用。
我认为你的问题是这一行:
$sum = $sum + $v / 10 + $v % 10;
维基说 'div' 和 'mod'。这意味着整数除法,而这不是它在做什么。
改为:
$sum = $sum + int ( $v / 10 ) + $v % 10;
你得到了想要的结果“3”。不过,我还没有用任何其他值检查过它,所以你最好检查一下。
编辑:第二个问题是因为我们 运行 从 0 到 7 而不是像示例中那样从 1 到 8。这意味着 'is i
even' test 得到了错误的数字。通过反转逻辑很容易解决(测试 'odd' 而不是 'even')。
将该位更改为:
if (0 != $i % 2) {
$v = $v * 2;
}