2013-05-14 2 views
0

Я могу напечатать все строки от /etc/passwd от UID и имени пользователя.Сравнение и отображение значений хэша

Я хотел был бы сравнить значения UID и отобразить соответствующие имена пользователей по <150 и >150.

это мой цикл в то время как и сосчитать

while(<PASSWD>){ 
    chomp; 
    my @f = split /:/; 
    sort @f; 
    @{$passwd{$f[3]}}[email protected]; 
    print @f[3 , 0], "\n"; 
} 

my $count = keys(%passwd); 
print $count, "\n"; 

ответ

3

sort @f ничего не делает - sort возвращает список отсортирован, но не меняет его на месте. Если вы добавили use warnings; в свою программу, Perl расскажет вам.

Это, как я хотел бы сделать это:

#!/usr/bin/perl 
use warnings; 
use strict; 

open my $PASSWD, '<', '/etc/passwd' or die $!; 

my %passwd; 
while (<$PASSWD>) { 
    chomp; 
    my @f = split /:/; 
    @{ $passwd{ $f[3] } } = @f; 
} 

my $reported = 0; 
for my $k (sort { $a <=> $b } keys %passwd) { 
    if ($k > 150 and not $reported) { 
     $reported = print "Over 150\n"; 
    } 
    print "$k\n"; 
} 

Вы также можете grep ключи для маленьких:

my @under150 = grep $_ < 150, keys %passwd; 
print $_->[0], "\n" for @passwd{ @under150 }; 
+2

историческая справка: http://www.nntp.perl.org /group/perl.perl5.porters/2004/06/msg92477.html – ysth

Смежные вопросы