Проверка GST через код состояния в регулярных выражениях не работает в Perl - PullRequest
0 голосов
/ 31 октября 2019

Я написал Perl-код для проверки номера GSTIN с помощью кода штата, выбранного клиентом в соответствии со следующими правилами:

  • Первые две цифры представляют код штата согласно индийской переписи 2011 года. Каждый штат имеет уникальный код.

  • Следующими десятью цифрами будет номер PAN налогоплательщика

  • Тринадцатая цифра будет назначена на основаниина номер регистрации в состоянии

  • Четырнадцатая цифра будет Z по умолчанию

  • Последняя цифра будет для контрольного кода. Это может быть алфавит или число.

Ниже приведен код:

my $gst_number_input = '35AABCS1429B1AX';

my $gst_number_character_count = length($gst_number_input);

my $state_code = '35';

my $gst_validation = qr/$state_code[A-Z]{5}\d{4}[A-Z][A-Z\d]Z[A-Z\d]/;

if ($gst_number_character_count == 15 && $gst_number_input =~ $gst_validation) {

    print "GST Number is valid";

} else {

    print "Invalid GST Number";
}

У меня есть ввод GSTIN, который соответствует коду состояния в скрипте. Поэтому, когда я запускаю скрипт, я получаю:

Invalid GST Number

Вместо этого я должен получить:

GST Number is valid

Может кто-нибудь помочь, пожалуйста?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Вероятно, вы бы предпочли иметь чек в виде подпрограммы

#!/usr/bin/perl

use strict;
use warnings;

my $debug = 0;

my @gst_numbers = <DATA>;

my $state_code = 35;

foreach my $gst_number (@gst_numbers) {
    chomp $gst_number;
    printf "%s %s\n",
            $gst_number, 
            validate_gst($gst_number,$state_code) 
            ? "valid" : "invalid";
}

sub validate_gst {
    my $gst_number = shift;
    my $state_code = shift;

    my %code;

    printf "%s : %s\n", 
            $gst_number, $state_code
            if $debug;

    my $gst_regex = qr/(\d{2})([A-Z\d]{10})(\d)(Z)([A-Z\d])/;

    return 0 if length $gst_number < 15;

    if( $gst_number =~ $gst_regex ) {
        @code{qw(st pan d z x)} = ($1,$2,$3,$4,$5);

        printf "ST: %s PAN: %s D: %s Z: %s X: %s\n", 
                $code{st},  # state code
                $code{pan}, # PAN number
                $code{d},   # state reg number
                $code{z},   # Z
                $code{x}    # check code
                if $debug;

        return 0 if $code{st}+0 != $state_code;             # state match?
        return 0 if $code{pan}  !~ /[A-Z]{5}\d{4}[A-Z\d]/;  # PAN correct?
        return 0 if $code{d}    !~ /\d/;                    # state reg number?
        return 0 if $code{z}    !~ /Z/;                     # Z?
                                                            # check code?
        return 1;   # check passed
    } else {
        return 0;   # check not passed
    }
}

__DATA__
1234567890123Z5
35AABCS1429B1AX
121234567890DZD
37AABCS6428B1AX
35AABCS2439B1ZX
42AABCS1429B1AX
35AABCS1729B1ZX

Белый медведь

1 голос
/ 01 ноября 2019

Вы утверждаете, что четырнадцатый символ представляет собой 'Z'.

Итак, ваш код работает. Четырнадцатый символ в $gst_number_input - это «A».

Измените код ввода так, чтобы ваш ввод имел Z в правильном месте, и вы получите GST Number is valid.

my $gst_number_input = '35AABCS1429B1ZX';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...