#!/usr/bin/perl use v5.20; use strict; use warnings; my $Num = Prepare_Num( q'51 824 753 556' ); my $verified = check_calc($Num); if( $verified == 1){ say "Valid ABN" }else{ say "ABN check has been unsuccessful" } sub check_calc{ my $Numset = shift; my $woset = weighting_oset(); --$Numset->[0][0]; print_oset($Numset); my $sum; for my $index( 0 .. 10 ){ $sum += $Numset->[$index][0] *= $woset->[$index][0]; } print_oset($Numset); $sum %89 == 0; } sub Prepare_Num{ my $NumString = shift; say "arg Num: $NumString"; $NumString =~ s/[^0-9]//g; say "s Num: $NumString"; my $count = $NumString =~ tr/0-9/0-9/; say "count: $count"; $count == 11 or die "non-conforming ABN. Please check."; say "tr Num: $NumString"; my $Numset = []; while( $NumString =~ m/([0-9])/g ){ push @$Numset, [$1]; } print_oset( $Numset, 1 ); return( $Numset ); } sub weighting_oset{ #my $woset = [[[0],[1]],[10]]; my $woset = [[10]]; push @$woset, map { $_ %2 == 1 ? [$_] : () } ( 1..19 ); print_oset( $woset ); return $woset; } sub print_oset{ my $Numset = shift; say "oset: ",@$Numset if @_; # $_[0] == 1; say "oset: \[", map("[@$_],", @$Numset), "\]"; } ##### From OP ####### sub Check_ABN { my $number = shift ; my $abn_invalid = 0 ; my $sum = 0 ; $number =~ s/\ //g ; unless (length($number) eq 11) { $abn_invalid = 1 ; return $abn_invalid ; } $sum += (substr($number,0,1)-1)*10 ; $sum += substr($number,1,1)*1 ; $sum += substr($number,2,1)*3 ; $sum += substr($number,3,1)*5 ; $sum += substr($number,4,1)*7 ; $sum += substr($number,5,1)*9 ; $sum += substr($number,6,1)*11 ; $sum += substr($number,7,1)*13 ; $sum += substr($number,8,1)*15 ; $sum += substr($number,9,1)*17 ; $sum += substr($number,10,1)*19 ; if ($sum % 89 eq 0) { return $abn_invalid ; } else { # $abn_error = 1 ; return $abn_invalid ; } # see https://abr.business.gov.au/Help/AbnFormat }