0

我想知道如何实现以下程序。
我想浏览/etc/passwd文件并搜索出现在多个人全名中的名字并打印这些人的全名。
到目前为止,我能够从/etc/passwd文件中打印用户名和相应的 ID。但我不知道如何有效地在整个文件中多次搜索用户名的出现。例如

  1. @lines:这个数组将包含/etc/passwd文件数据
  2. 然后我从数组的每一行中提取用户名@lines
  3. 现在我想在剩余列表中搜索此用户名(在步骤 2 中找到),如果找到用户名,则打印这些全名。

我不知道我应该如何实施第 3 步。

任何帮助和指导都会很棒...

例如,在 /etc/passwd 文件中,以下是存储的全名: 1. vijaykumar yadav 2.sureshkumar jain 3. chandan rai 然后“kumar”是出现在 vijaykumar 和 Sureshkumar 的全名中的用户名,然后打印这两个名称在输出中。

输出将是 1. vijaykumar yadav 2.sureshkumar jain

4

1 回答 1

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;
于 2013-10-03T20:33:53.547 回答