我想知道如何实施以下程序
我想查看/etc/passwd
文件并搜索以多个人的全名出现的姓名,并打印这些人的全名。
到目前为止,我能够从/etc/passwd
文件中打印用户名和相应的ID。但我不知道如何有效地在整个文件中多次搜索用户名的出现次数。
例如
@lines
:此数组将包含/etc/passwd
文件数据@lines
我不知道应该如何实施第3步。
任何帮助和指导都会很棒......
例如 在/ etc / passwd文件中,下面是存储的全名: 1. vijaykumar yadav 2. sureshkumar jain chandan rai 然后'kumar'是出现在vijaykumar和sureshkumar全名中的用户名,然后在输出中打印这两个名字。
输出将是 1. vijaykumar yadav 2. sureshkumar jain
答案 0 :(得分:1)
我不确定您期望的输出,也不确定我的代码是否符合您的要求,但以下代码首先查找出现在某人全名(部分)中的用户名。然后显示用户名以某个全名显示的内容。我知道这是一个丑陋的代码,可能不是最有效的解决方案,但请告诉我这是否是您预期的输出。
#!/usr/bin/perl
use strict;
use warnings;
open PASSWD, "/etc/passwd" or die "$!";
my @usernames;
my @fullnames;
while (<PASSWD>) {
chomp;
# First entry is username, 5th entry is full name if exists.
push @usernames, (split ":", $_)[0];
my $fullname = (split ":", $_)[4];
push @fullnames, $fullname if $fullname ne "";
}
my %found_usernames;
foreach my $username (@usernames) {
foreach my $fullname (@fullnames) {
if ($fullname =~ m/$username/i) {
# Push to the array if full name was already found before.
# Otherwise, create an anonymous array
if (defined $found_usernames{$fullname}) {
push $found_usernames{$fullname}, $username
}
else {
$found_usernames{$fullname} = [$username];
}
}
}
}
# Print
foreach my $key (keys %found_usernames) {
print "Users: ", join(",", @{$found_usernames{$key}}), " appear in fullname $key\n";
}
close PASSWD;