#!/usr/perl/bin #Simple program to check validity of 16 digit credit card numbers use strict; use warnings; print processCard($_) for 'x', '41245678912345', '3124567891234560', '3324567891234560', '4124567891234560'; sub processCard { my ($cardNum) = @_; return "Invalid Input: $cardNum.\n" if $cardNum !~ /^[0-9]+$/; return "16 digit cards only for now ($cardNum).\n" if length $cardNum != 16; return "Invalid Card Number $cardNum\n" if !numberOK($cardNum); return cardInfo($cardNum); } sub numberOK { my @cardNum = split //, shift; for my $i (map {$_ * 2} 0 .. $#cardNum / 2) { $cardNum[$i] *= 2; $cardNum[$i] -= 9 if $cardNum[$i] >= 10; } my $total = 0; $total += $_ for (@cardNum); return $total % 10 == 0; } sub cardInfo { my ($cardNum) = @_; my %issuers = (4 => "VISA", 5 => "MasterCard", 6 => "Discover"); my ($iDigit) = $cardNum =~ /^(\d)/; return "Unknown issuer code: $iDigit\n" if !exists $issuers{$iDigit}; return <