Как сохранить / etc / passwd в хэше или массиве? - PullRequest
1 голос
/ 07 февраля 2011

Я хотел бы сохранить содержимое /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";

}

Я предполагаю, что это должен быть массив хэшей, где ключом является имя пользователя, но я не могу понять, как это сделать.

Является ли «Массив хэшей массива» подходом?

Ответы [ 3 ]

12 голосов
/ 07 февраля 2011

См. Passwd :: Unix :

АННОТАЦИЯ

Passwd::Unix предоставляет абстрактный объектно-ориентированный и функциональный интерфейс для стандартных файлов Unix, таких как/etc/passwd, /etc/shadow, /etc/group.Кроме того, этот модуль обеспечивает среду для тестирования нового программного обеспечения без использования системных критических файлов в /etc

3 голосов
/ 07 февраля 2011

Сохраните его в хэше с именами пользователей в качестве ключей и массивом разбиения в качестве значения:

my %passwd = ();

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

    chomp;
    my @f = split /:/;
    @{$passwd{$f[0]}} = @f;
}
print $passwd{'Sjoerder'}[3];
2 голосов
/ 07 февраля 2011

Структура данных, которую вы выбираете, действительно зависит от того, что вы хотите сделать с данными. Если вас больше всего интересует получение данных для данного пользователя, вы можете просто использовать прямой хеш, где ключи - это имена пользователей, а значение для данного ключа - это ссылка на массив значений из / 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";
}

Надеюсь, это даст вам некоторые идеи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...