我想将/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";
}
我认为它应该是一个哈希数组,其中用户名是关键,但我无法弄清楚如何做到这一点。
“阵列哈希数组”是否可行?
答案 0 :(得分:12)
请参阅Passwd::Unix:
摘要
中的系统关键文件
Passwd::Unix
为标准Unix文件提供了一个抽象的面向对象和函数接口,例如/etc/passwd
,/etc/shadow
,/etc/group
。此外,该模块提供了测试新软件的环境,而无需使用/etc
答案 1 :(得分:3)
将其存储在哈希中,其中用户名为键,分割数组为值:
my %passwd = ();
open PASSWD, "/etc/passwd";
while(<PASSWD>) {
chomp;
my @f = split /:/;
@{$passwd{$f[0]}} = @f;
}
print $passwd{'Sjoerder'}[3];
答案 2 :(得分:2)
您选择的数据结构实际上取决于您要对数据执行的操作。如果您最感兴趣的是为给定用户提取数据,那么您可以使用直接哈希,其中键是用户名,给定键的值是对/ etc / passwd中值的数组的引用: / p>
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";
}
希望这会给你一些想法!