MrTEE has asked for the wisdom of the Perl Monks concerning the following question:
I have a script that parses df into something that perl can use.
1 #!/usr/bin/perl 2 use strict; 3 use warnings; 4 5 my @headers = qw(name size used free capacity mount); 6 my @df = `df -k`; 7 shift @df; # get rid of the header 8 9 my %devices; 10 for my $line (@df) { 11 my %info; 12 @info{@headers} = split /\s+/, $line; # note the hash slice 13 $info{capacity} = _percentage_to_decimal($info{capacity}); 14 $devices{ $info{mount} } = \%info; 15 } 16 17 # Change 12.3% to .123 18 sub _percentage_to_decimal { 19 my $percentage = shift; 20 $percentage =~ s{%}{}; 21 return $percentage / 100; 22 } 23 # Now the information for each device is in a hash of hashes. 24 25 # Show how much space is free in device /dev/ad4s1e 26 print $devices{"/production/log"}{free} ; 27 print "\n"; 28 for my $info (values %devices) { 29 # Skip to the next device if its capacity is not over 60%. 30 next unless $info->{capacity} > .10; 31 32 # Print some info about each device 33 printf "%s is at %d%% with %dK remaining.\n", 34 $info->{mount}, $info->{capacity}*100, $info->{free}; 35 }
However I keep getting these warnings.
Use of uninitialized value in substitution (s///) at ./get_df line 21. Use of uninitialized value in division (/) at ./get_df line 22. Use of uninitialized value in hash element at ./get_df line 15. Use of uninitialized value in substitution (s///) at ./get_df line 21. Use of uninitialized value in division (/) at ./get_df line 22. Use of uninitialized value in hash element at ./get_df line 15. Use of uninitialized value in substitution (s///) at ./get_df line 21. Use of uninitialized value in division (/) at ./get_df line 22. Use of uninitialized value in hash element at ./get_df line 15. Use of uninitialized value in substitution (s///) at ./get_df line 21. Use of uninitialized value in division (/) at ./get_df line 22. Use of uninitialized value in hash element at ./get_df line 15. Use of uninitialized value in substitution (s///) at ./get_df line 21. Use of uninitialized value in division (/) at ./get_df line 22. Use of uninitialized value in hash element at ./get_df line 15. 9006792 /production/log is at 70% with 9006792K remaining. / is at 37% with 17037532K remaining. /production is at 11% with 13171728K remaining. /export/home is at 24% with 11199904K remaining. /production/archive is at 18% with 8095796K remaining. /boot is at 28% with 68351K remaining.
I looked at the DF module on CPAN last night at home, but I would have to get sysadmin approval to get it installed. On the df the Filesystem is too long, so it gets printed to another line. I can df -k | grep -v out the long filenames. The long file names on the extra line messed up the data dumper print out - some of the hash values get labeled undef.
casper@casperbox]:~/.wjohnson> df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup00-LogVol00 28313732 9816924 17035356 37% / /dev/sda1 101086 27516 68351 29% /boot tmpfs 2987896 0 2987896 0% /dev/shm /dev/mapper/VolGroupPROD-ExportHome 15481840 3495504 11199904 24% /export/home /dev/mapper/VolGroupPROD-Production 15481840 1523692 13171716 11% /production /dev/mapper/VolGroupPROD-ProdLog 30963708 20410952 8979892 70% /production/lo +g /dev/mapper/VolGroupPROD-ProdArchive 10313016 1693640 8095500 18% /production/ar +chive [casper@casperbox]:~/.wjohnson> [casper@casperbox]:~/.wjohnson> [casper@casperbox]:~/.wjohnson> [casper@casperbox]:~/.wjohnson> [casper@casperbox]:~/.wjohnson> df -k | grep -v dev Filesystem 1K-blocks Used Available Use% Mounted on 28313732 9816924 17035356 37% / 15481840 3495504 11199904 24% /export/home 15481840 1523692 13171716 11% /production 30963708 20410952 8979892 70% /production/lo +g 10313016 1693640 8095500 18% /production/ar +chive [casper@casperbox]:~/.wjohnson>
From Data::Dumper - many of the hash values are coming up as undefined. is there a way that I could predefine the values of the hash. I want to learn to get rid of them. grepping out the long filenames works but it seems like a hack around a problem that i have very often in Perl - the undefined values.
$VAR1 = {}; Use of uninitialized value in substitution (s///) at ./get_df.just_cap +acity line 24. Use of uninitialized value in division (/) at ./get_df.just_capacity l +ine 25. Use of uninitialized value in hash element at ./get_df.just_capacity l +ine 17. $VAR1 = { '' => { 'free' => undef, 'mount' => undef, 'used' => undef, 'name' => '/dev/mapper/VolGroup00-LogVol00', 'capacity' => '0', 'size' => undef } }; $VAR1 = {}; $VAR1 = { '' => { 'free' => undef, 'mount' => undef, 'used' => undef, 'name' => '/dev/mapper/VolGroup00-LogVol00', 'capacity' => '0', 'size' => undef },
this is resolved by using df -k | grep -v var - but there has to be a better way. i tried an if statment checking that if a hash element was not defined to assign it a 1, but it kept on throwing out more errors.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: undefined hash elements
by marinersk (Priest) on Dec 19, 2013 at 00:03 UTC | |
by MrTEE (Novice) on Dec 19, 2013 at 15:33 UTC | |
by marinersk (Priest) on Dec 20, 2013 at 04:51 UTC | |
Re: undefined hash elements
by Random_Walk (Prior) on Dec 18, 2013 at 20:58 UTC | |
by MrTEE (Novice) on Dec 18, 2013 at 21:07 UTC | |
by MrTEE (Novice) on Dec 18, 2013 at 21:10 UTC | |
Re: undefined hash elements
by roboticus (Chancellor) on Dec 18, 2013 at 20:52 UTC | |
Re: undefined hash elements
by rmcgowan (Sexton) on Dec 18, 2013 at 21:25 UTC | |
by MrTEE (Novice) on Dec 18, 2013 at 22:21 UTC | |
by MrTEE (Novice) on Dec 18, 2013 at 22:41 UTC | |
by MrTEE (Novice) on Dec 19, 2013 at 15:28 UTC | |
Re: undefined hash elements
by MrTEE (Novice) on Dec 18, 2013 at 20:57 UTC | |
by jethro (Monsignor) on Dec 18, 2013 at 21:54 UTC | |
by GrandFather (Saint) on Dec 19, 2013 at 00:41 UTC |