Luhn 算法主要应用在校键数字卡号的合法性,例如我们常见的银行卡,信用卡,ICCID号等等。
Luhn 算法简单的说,既从低位开始,基数位相加的和,与处理过的(将当前偶数位数字×2,若结果大于9,则将2位数字相加得到个位数,若结果小于等于9,直接记录这个值)偶数位相加的和的总和,若可被10整除,则合法,反之则不合法。
算法如下:
#!/usr/bin/perl use strict; use warnings; #定义一个卡号 my $cardNum = "4367421590502289184"; sub luhnCheckNum{ my $oddSum = 0; my $evenSum = 0; my $isOdd = 1; for(my $i=length($_[0])-1; $i>=0; $i--){ my $iNum = substr($_[0],$i,1); if($isOdd){ $oddSum += $iNum; }else{ $iNum = $iNum*2; if($iNum>9){ my @iNumArry = split(//, $iNum); $iNum = $iNumArry[0]+$iNumArry[1]; } $evenSum += $iNum; } $isOdd = !$isOdd; } return (($evenSum + $oddSum)%10==0) } if(luhnCheckNum($cardNum)){ print "您输入卡号合法"; }else{ print "您输入的卡号不合法"; }