2011-02-07 2 views
1

/etc/passwd의 내용을 구조체에 저장하고 싶습니다. 나중에 각 값을 업데이트 할 수는 있지만 사용할 구조를 결정할 수 없습니다.해시 또는 배열에/etc/passwd를 저장하는 방법은 무엇입니까?

#!/usr/bin/perl 

use warnings; 
use strict; 

open PASSWD, "/etc/passwd"; 
while(<PASSWD>) { 

    chomp; 
    my @f = split /:/; 

    print "username $f[0]\n"; 
    print "password $f[1]\n"; 
    print "uid  $f[2]\n"; 
    print "gid  $f[3]\n"; 
    print "gecos $f[4]\n"; 
    print "home  $f[5]\n"; 
    print "shell $f[6]\n"; 
    print "--------------------------\n"; 

} 

사용자 이름이 키인 해시 배열이어야한다고 가정하지만이를 수행하는 방법을 알 수는 없습니다.

"배열의 해시 배열"은 갈 길입니까?

+1

해마다 ['getpw *'and friends] (http://perldoc.perl.org/perlfunc.html#Fetching-user-and-group-info)에 대한 사랑이 적습니다. – daxim

+0

및 그 이유는 분명하지 않습니다. 나는 적어도 일주일에 한 번 그 중 하나를 사용합니다. –

답변

3

저장 위치에 중요한 파일 시스템을 이용하지 않고, 새로운 소프트웨어를 테스팅 환경을 제공하고, 값으로 분할 어레이 :

my %passwd =(); 

open PASSWD, "/etc/passwd"; 
while(<PASSWD>) { 

    chomp; 
    my @f = split /:/; 
    @{$passwd{$f[0]}} = @f; 
} 
print $passwd{'Sjoerder'}[3]; 
12

Passwd::Unix를 참조하십시오

Passwd::Unix 표준 유닉스 파일에 대한 추상적 인 객체 지향과 기능 인터페이스를 제공

추상, 같은 /etc/passwd, /etc/shadow, /etc/group. Additionaly이 모듈은 키와 같은 사용자 이름과 해시에 /etc

2

데이터 구조 당신은 정말로 당신이 데이터로 무엇을하고 싶은지에 달려 있습니다. 주어진 사용자에 대한 데이터를 가져 오는 데 가장 관심이 있다면 키가 사용자 이름이고, 주어진 키의 값이/etc/passwd의 값 배열에 대한 참조 인 경우에는 바로 해시를 사용할 수 있습니다 :

open PASSWD, '/etc/passwd'; 
my %users; 
while (<PASSWD>) { 
    chomp; 
    next if /^\s*#/; # ignore comments 
    my ($username, @details) = split /:/; 
    $users{$username} = \@details; 
} 

# get values for user 'root' 
my $values = $users{'root'}; 

# print root's home 
print $values->[4]; 

당신은 당신이 각 사용자를 나타내며, 사용자 이름, 암호, UID 등을 위해 키가 한 곳, 해시의 배열을 선택할 수있는 모든 사용자를 반복하고 읽을 수있는 방식으로 정보를 끌어 할 수있게하려면 :

open PASSWD, '/etc/passwd'; 
my @users; 
while (<PASSWD>) { 
    chomp; 
    next if /^\s*#/; # ignore comments 
    my @f = split /:/; 
    my %hash; 
    @hash{'username','password','uid','gid','gecos','home','shell'} = @f; 
    push @users, \%hash; 
} 
for my $user (@users) { 
    print "User $user->{username} has home $user->{home}\n"; 
} 

희망 사항이 있으면 아이디어를 얻을 수 있습니다.

+0

배열 배열은 성능을 위해 데이터를 반복하는 더 좋은 옵션이라고 생각합니다. 그리고 가독성과 유지 보수성을 위해 배열 인덱스 번호를 기억하기보다는 "상수"를 정의하십시오. 그러나 당신의 요점은 여전히 ​​중요합니다. 어떻게 접근 할 것인지 이해하지 못하면 구조를 제안 할 수 없습니다. – BMitch

+3

@B Mitch : 보통'/ etc/passwd' (보통 시스템 계정을 포함하여 몇 십여 명의 사용자)의 크기를 감안할 때 내용을 반복 할 때 성능을 최적화하는 것은 무의미한 것처럼 보입니다. 대신 가독성 또는 기능성을 위해 최적화하십시오. –

관련 문제