Perl count the shop in all specific files

Currently, i am trying to count the unqiue shop count in all the specific files. I am getting output on specified dates rather all the dates.
Code

sub check_day1 {

    my ($base, $closed, $source) = @_;

    my (%day, %delivered, %extras, %shop_list);

    for my $file (<$base.*casa*>) {

        my @elem = split /\./, basename($file);

        my $extn = pop @elem;

        my $ext = $elem[5];

        if ( $extn eq 'sales' && $ext eq 'casa'  ) {

            my $date = $elem[4];

            next  unless $date =~ m/^\d{8}$/;

           open IN, $file or die "Unable to open $file: $!";

            while (<IN>) {

             chomp;

             my @elem = split /\t/;

             my (undef, $shop, undef, undef, undef, undef) = @elem;

             if ( ! defined $shop_list{$shop} ) {

             $day{$date}++;

             $shop_list{$shop} = 1;

        }

    }

    close IN or die "Unable to close $file: $!";

        } else {

            $extras{$extn}++;

        }

    }

my $num_day = 0;

    print "Sales dates from split sales: \n";

    for my $day ( sort keys %day ) {

        my $closed_day = 0 ;

        if ( defined $$closed{$day} ) {

            $closed_day = 1;

            delete $$closed{$day};

        }

        my $file;

        if ( $source eq 'R' ) {

            $file = $day{$day} == 1 ? "shop" : "shop";

        } else {

            $file = $day{$day} == 1 ? "file" : "files";

        }

        if ( $closed_day ) {

            $delivered{$day} = "  $day:  $day{$day} $file (Note - shop marked as closed for this day)\n";

            push @messages, "  $day:  $day{$day} $file (Note - shop marked as closed for this day)";

        } else {

            $delivered{$day} = "  $day:  $day{$day} $file\n";

            push @messages, "  $day:  $day{$day} $file";

        }

        $num_day++;

    }

    for my $day ( sort keys %$closed ) {

        $delivered{$day} = "  $day:  $$closed{$day}\n";

        $num_day++;

    }

    for my $day ( sort keys %delivered ) {

        print $delivered{$day};

    }

    if ( %extras ) {

        print "\nNon-sales files:\n";

        for my $extn ( sort keys %extras ) {

            my $file = $extras{$extn} == 1 ? "file" : "files";

            printf "  %-8s:  %s $file\n", $extn, $extras{$extn};

        }

    } else {

        print "\nNo non-sales files found\n";

    }

    return $num_day;

}
Input:
file.uk.2300.ttt.20240111.casa.sales
file.uk.2300.ttt.20240112.casa.sales
Current Output: 
20240111 : 185 shop 
Expected  output 
20240111: 185 shop 
20240112: 185 shop

Is it possible that all the field 2 events ($shop) are already present in the shop_list after parsing the 1st file? and if so, should that be local to the for each file loop?

@Siva2023, welcome

can you show some sample data from EACH file please.

thks

I have used delete shop_list and currently it is listing all files with duplicate shop counts. But i am looking the count without duplicates.

if ( $extn eq 'sales' && $ext eq 'casa'  ) {

 

            my $date = $elem[4];

 

            next  unless $date =~ m/^\d{8}$/;

 

           open IN, $file or die "Unable to open $file: $!";

 

            while (<IN>) {

 

             chomp;

 

             my @elem = split /\t/;

 

             my (undef, $shop, undef, undef, undef, undef) = @elem;

 

             if ( ! defined $shop_list{$shop} ) {

 

             $day{$date}++;

 

             $shop_list{$shop} = 1;

 

        }

    delete $shop_list{$shop};

    }

 

    close IN or die "Unable to close $file: $!";

 

        } else {

 

            $extras{$extn}++;

 

        }

 

    }



Current output:

20240111: 6000 shop
20240112: 6500 shop


Expected output:

Duplicate count nèed to removed

20240111: 75 shop
20240112: 75 shop

Delete shop_list and now all the files are reporting. But still the duplicate counts are not removed.

Perhaps declare it, but within the loop - that way your only eliminating duplicates within a file rather than all the data:

So this

sub check_day1 {
    my ($base, $closed, $source) = @_;
    my (%day, %delivered, %extras, %shop_list);
    for my $file (<$base.*casa*>) {

becomes

sub check_day1 {
    my ($base, $closed, $source) = @_;
    my (%day, %delivered, %extras);
    for my $file (<$base.*casa*>) {
        my %shop_list;