Perl

Routine to capture warnings

Useful subroutine when running perl with a debugger so you can set a breakpoint for each perl warning
my $warning_num= 0;
$SIG{__WARN__} = sub {
    #$DB::single = 1;
    print STDOUT @_;
    die if $warning_num++ > 50; 
    return 1; 
};
 
sub build_hashes {
 
    &sub_debug_info ( (caller(0))[3] );
 
    ## Generate a sorted list of disks
    my @disks = sort keys %{$du{$mnt}{children}};
 
    ## Generate a sorted list of volumes
    foreach my $disk (sort @disks) {
        $vol_list{$disk_tree_map{$disk}} = 1;
    }
 
    ## Use recursion to fill global hashes
    &build_global_data (\%{$du{$mnt}});
    print STDERR Dumper %du if $debug ;
 
    foreach my $disk (keys %{$dir_user_hash{$mnt}}) {
        my %thash = %{$du{$mnt}{$disk}};
        foreach my $dir (keys %thash) {
            my (@dirs) = File::Spec->splitdir( $dir );
            my ($project) = @dirs;
 
            # Create %dir_hash hash
            # Create %user_dir_hash
            foreach my $user (keys %{$thash{$dir}}) {
                $dir_hash{$mnt}{$disk}{$dir}{size}               += $thash{$dir}{$user}{size};
                $dir_hash{$mnt}{$disk}{$dir}{files}              += $thash{$dir}{$user}{files};
                $dir_hash{$mnt}{$disk}{$dir}{age}                = &min ($thash{$dir}{$user}{age}, $dir_hash{$mnt}{$disk}{$dir}{age});
                $user_dir_hash{$mnt}{$disk}{$user}{$dir}{size}    = $thash{$dir}{$user}{size};
            }
 
            ## Sum du per project
            if (@dirs == 1) {
                foreach my $user (keys %{$thash{$dir}}) {
                    my $size = $thash{$dir}{$user}{size};
 
                    ## Sum user total du
                    $user_total_usage{$user}        = $size if !exists  $user_total_usage{$user};
                    $user_total_usage{$user}       += $size;
 
                    ## Sum user disk usage
                    $user_disk_usage{$user}{$disk} = $size if !exists  $user_disk_usage{$user}{$disk};
                    $user_disk_usage{$user}{$disk} += $size; 
 
                    ## Sum user project du
                    next unless $project =~ /[mt]\d{4}/;
                    $user_project_usage{$project}{$user} =  0 if !exists $user_project_usage{$project}{$user};
                    $user_project_usage{$project}{$user} = $user_project_usage{$project}{$user} + $size;
                }
            }
        }
    }
}