Perl - 输出不一致

时间:2015-08-04 10:41:40

标签: regex perl

这是匹配用户及其家庭存储容量的代码,奇怪的是它产生相同的结果五次,而不是五次独特的结果。

open( my $storage_input, "du -shc /home/*|" );

while ( my $line3 = <$storage_input> ) {
    push( @user_storage, $line3 );
}

foreach my $line3 ( @user_storage ) {
    if ( $line3 =~ m/^([0-9](.){1,})M\s+\/[a-z]{1,4}\/([a-z]{4}|[a-z]{1}\d{2}[a-z]{5})/ ) {
        %storage = ( "data" => "$1", "user" => "$3", );
        push( @storage_data, \%storage );
    }

}

print "\n";

foreach ( my $i = 0 ; $i < scalar( @storage_data ) ; $i++ ) {
    print $storage_data[$i]{"user"};
    print " has used ";
    print $storage_data[$i]{"data"};
    print " MiB of storage.\n";
}

这是我们匹配的命令输出:

3.4M    /home/jony  
3.4M    /home/luha  
40M /home/maho  
35M /home/mipa  
3.0M    /home/svkn  

1 个答案:

答案 0 :(得分:2)

您将对%storage的引用推送到@storage_data,然后更改%storage。您应该为循环的每次迭代使用不同的%storage,即将my添加到其赋值中。

my %storage = (

您使用strict吗?

或者,您可以存储匿名哈希:

push @storage_data, { data => "$1",
                      user => "$3",
                    };