# Ref: http://www.perlmonks.com/?node_id=1196078 use Data::Dumper; %data_hash = (); %output_hash = (); @master_dsks = ( 70, 71, 75, 90, 91, 92, 93, 96, 97, 98, 99, 190, 204, 205, 550, 551 ); @master_sites = ( 350, 377, 510, 512, 580, 587, 590, 1100, 1105, 1107, 1108 ); # ---- printf("All Known Dsks:\n"); # Show ALL the known dsks foreach (@master_dsks) { printf("%s ", $_); } printf("\n\n"); # ---- printf("All Known Sites:\n"); # Show ALL the known sites foreach (@master_sites) { printf("%s ", $_); } printf("\n\n"); # ---- while( ) { # Build list of unique (site:dsk) items ($site, $buf) = split(/,/, $_); @input_item = split(/:/, $buf); foreach $input_field (@input_item) { # EX: "VAR8=36!206!207!" @dsk_list = ($input_field =~ /([0-9]+)!([0-9]+)!$/); # Get last 2 of 3 items foreach $dsk (@dsk_list) { # Each dsk item in the input... next if ($dsk == 0); # Skip '0' dsk items $key = $site . ":" . $dsk; # Build composite key $data_hash{$key}++; # ...and save it } } } foreach $key ( sort keys %data_hash ) { # Build list of dsk -> (multi sites) ($site, $dsk) = split(/:/, $key); push( @{ $output_hash{$dsk} }, $site ); # ... dsk -> (multi sites) push( @{ $site_2_dsk{$site} }, $dsk ); # !!! ADDITION !!! ... site -> (multi dsks) } # ---- printf("List of sites for each used dsk:\n"); foreach $dsk (sort {$a <=> $b} keys %output_hash) { # Show list of sites for each dsk printf("Dsk: %d: ... ", $dsk); foreach $site (sort {$a <=> $b} @{$output_hash{$dsk}}) { printf(" %d ", $site); } printf("\n"); } printf("\n"); printf("List of dsks for each used site:\n"); foreach $site (sort {$a <=> $b} keys %site_2_dsk) { # Show list of dsks for each site printf("Site: %d: ... ", $site); foreach $dsk (sort {$a <=> $b} @{$site_2_dsk{$site}}) { printf(" %d ", $dsk); } printf("\n"); } printf("\n"); # ---- my %master_dsks_hash = map { $_ , "" } @master_dsks; # Hash of ALL dsks delete @master_dsks_hash{keys %output_hash}; # Delete the USED dsks @unused_dsks = (keys %master_dsks_hash); # ...leaving the UNUSED dsks printf("Dsks that are known but unused:\n"); foreach (sort {$a<=>$b} @unused_dsks) { printf("%s ", $_); } printf("\n\n"); # ---- my %master_sites_hash = map { $_ , "" } @master_sites; # Hash of ALL sites delete @master_sites_hash{keys %site_2_dsk}; # Delete the USED sites @unused_sites = (keys %master_sites_hash); # ...leaving the UNUSED sites printf("Sites that are known but unused:\n"); foreach (sort {$a<=>$b} @unused_sites) { printf("%s ", $_); } printf("\n\n"); __DATA__ 1108,VAR6=36!204!205!:VAR8=36!206!207!:VAR13=36!70!0!:VAR14=36!70!71!:VAR15=36!71!0! 377,VAR12=36!97!96! 512,VAR6=36!90!91!:VAR8=36!92!93!:VAR11=36!0!70!:VAR12=36!189!190! 587,VAR2=36!550!0!:VAR4=36!554!0!:VAR6=36!551!0!