我有一个脚本可以解析df到perl可以使用的东西。
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 }
但是我一直收到这些警告。
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.
更新: 我昨晚在家看了CPAN上的DF模块,但我必须获得sysadmin批准才能安装它。 在文件系统太长的时候,它被打印到另一行。这搞砸了数据转储器的打印输出 - 一些哈希值被标记为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/log
/dev/mapper/VolGroupPROD-ProdArchive
10313016 1693640 8095500 18% /production/archive
[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/log
10313016 1693640 8095500 18% /production/archive
[casper@casperbox]:~/.wjohnson>
来自Data :: Dumper - 许多哈希值都是未定义的。有没有办法可以预定义哈希的值。我想学会摆脱它们。
$VAR1 = {};
Use of uninitialized value in substitution (s///) at ./get_df.just_capacity line 24.
Use of uninitialized value in division (/) at ./get_df.just_capacity line 25.
Use of uninitialized value in hash element at ./get_df.just_capacity line 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
},
这是通过使用df -k | grep -v var
来解决的 - 但必须有更好的方法。
答案 0 :(得分:5)
使用未定义的值,就像它已经定义一样。它被解释为“”或0,但也许这是一个错误。要禁止此警告,请为变量分配定义的值。
为了帮助您找出未定义的内容,perl将尝试告诉您未定义的变量(如果有)的名称。在某些情况下,它无法执行此操作,因此它还会告诉您使用未定义值的操作。但是,请注意,perl会优化您的程序,并且警告中显示的操作可能不一定会出现在您的程序中。例如,“$ foo”通常被优化为“那个”。 $ foo,警告将引用连接(。)运算符,即使没有。在你的程序中。
简而言之,您使用了一个变量,就好像它包含一个字符串或数字,但它的值是undef
,可能是因为它从未收到过值或因为它不存在。
也许您使用的是错误的变量名称。也许您需要提供默认值。原因无数,所以没有一个单一的解决办法。
答案 1 :(得分:1)
让我们专注于第一次警告。在20/21行的某处,你得到一个undef警告。正如已经指出的那样,要么你指定了一个不存在的变量(拼写错误?),要么变量从未被初始化。
将变量保留为单位化没有任何问题,只要您测试它是否未初始化。
我使用了很多哈希结构,并实例化它们:
my %test_data;
如果我的逻辑在某种程度上支持填充此哈希,那么当我去使用%test_data
时,我首先测试它是否设置为undef
。
if(%test_data)
{
<do something using the hash>;
}
在您的情况下,您将$percentage
设置为某个值,但$percentage
显示为undef
。 $percentage =~ s{%}{};
因此,在你到达那一行之前,你需要在!$percentage
。
答案 2 :(得分:1)
您的代码似乎对我很好(在Ubuntu 13.10上运行Perl 5.14.2)。
我怀疑问题是你机器上的df
命令没有以与代码期望相同的格式返回数据。