Thread Hash-Slice und die Ausgabe... (19 answers)
Opened by Duff at 2008-07-23 19:02

Linuxer
 2008-07-23 20:25
#112523 #112523
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
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!

View full thread Hash-Slice und die Ausgabe...