Try structuring your program like this, only print headers/content in one place , it makes debugging easier
#!/usr/bin/perl --
use strict;
use warnings;
use DBI;
use CGI qw/:all :html3/;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI::Session qw();
Main( @ARGV );
exit( 0 );
sub Main {
my $cgi = CGI->new;
my $session = CGI::Session->new((undef, $cgi, { Directory=>"/tmp"}
+));
my $next = determine_dispatch( $cgi, {
dashboard_status => \&dashboard_status ,
errlogin => \&errlogin ,
_default => \&default,
} );
my $dbh= DBI->connect(
'DBI:mysql:database=insite_dashboard:user=root;host=152.102.12
+9.45',
{ RaiseError => 1, PrintError => 1, },
) ;
my $headers_content = $next->( $cgi, $session, $dbh );
print @$headers_content;
}
sub determine_dispatch {
my( $cgi, $dispatch_hash ) = @_;
my $path_info = $cgi->path_info;
while( my( $path, $callback ) = each %$dispatch_hash ){
if( $path_info =~ m{\Q$path\E} ){
return $callback;
}
}
return $dispatch_hash->{_default};
}
sub dashboard_status {
my( $cgi, $session, $dbh ) = @_;
...
return [ $session->header, $dash_content ];
}
sub errlogin {
my( $cgi, $session, $dbh ) = @_;
...
return [ $session->header, $err_content ];
}
sub default {
my( $cgi, $session, $dbh ) = @_;
...
return [ $session->header, $default_content ];
}