Thread Hash-Slice und die Ausgabe...
(19 answers)
Opened by Duff at 2008-07-23 19:02
Hi,
nun bin ich zuhause und kann mich mehr damit beschäftigen; basierend auf Deinem Ausgangsskript würd ich das so implementieren. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #!/usr/bin/perl # vi:ts=4 sw=4 et: use strict; use warnings; #> global variables #> ---------------------------------------------------------------------------- my $file = '/etc/passwd'; #> sub routines #> ---------------------------------------------------------------------------- sub parse_passwd { my $passwdfile = shift; my %passwd = (); open my $fh, '<', $passwdfile or die "$passwdfile: open(ro) failed: $!\n"; while ( my $line = <$fh> ) { chomp $line; my ( $user, $pw, $uid, $gid, $com, $home ) = split m{:}, $line; if ( $uid >= 1_000 and $user =~ m{\A[A-Za-z0-9]+\z} and !exists $passwd{$user} ) { push @{ $passwd{$user} }, $uid, $gid, $com, $home; } } close $fh; return \%passwd; } sub print_passwd { my $hash_r = shift; for my $user ( keys %$hash_r ) { # unformatierte ausgabe print "$user: @{ $hash_r->{$user} }\n"; # formatierte ausgabe printf "%s: %d %d '%s' %s\n", $user, @{ $hash_r->{$user} }; # nur user listen, die nicht gid==100 sind if ( $hash_r->{$user}->[1] != 100 ) { printf "%s: %d %d %s %s\n", $user, @{ $hash_r->{$user} }; } } } #> main script #> ---------------------------------------------------------------------------- print_passwd( parse_passwd( $file ) ); __END__ Noch besser lesbar wird es, wenn Du anstatt des HoA (Hash of Array) einen HoH (Hash of Hash) verwendest. Speziell, wenn Du später auf einzelne Elemente zugreifen willst, ohne dass Du Dir merken musst, hinter welchem Index sich welcher Wert versteckt. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #!/usr/bin/perl # vi:ts=4 sw=4 et: use strict; use warnings; #> global variables #> ---------------------------------------------------------------------------- my $file = '/etc/passwd'; #> sub routines #> ---------------------------------------------------------------------------- sub parse_passwd { my $passwdfile = shift; my %passwd = (); open my $fh, '<', $passwdfile or die "$passwdfile: open(ro) failed: $!\n"; while ( my $line = <$fh> ) { chomp $line; my ( $user, $pw, $uid, $gid, $com, $home ) = split m{:}, $line; if ( $uid >= 1_000 and $user =~ m{\A[A-Za-z0-9]+\z} and !exists $passwd{$user} ) { $passwd{$user} = { gid => $gid, uid => $uid, comment => $com, homedir => $home, }; } } close $fh; return \%passwd; } sub print_passwd { my $hash_r = shift; for my $user ( keys %$hash_r ) { # nur user listen, die nicht gid==100 sind if ( $hash_r->{$user}->{gid} != 100 ) { printf "%s: %d %d %s %s\n", $user, @{$hash_r->{$user}}{ qw( uid gid comment homedir) }; } } } #> main script #> ---------------------------------------------------------------------------- print_passwd( parse_passwd( $file ) ); __END__ meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |