どのような出力が期待されるか、また私のコードが希望どおりに動作するかどうかはわかりませんが、次のコードはまず、誰かの氏名 (の一部) に含まれるユーザー名を探します。次に、特定のフルネームに表示されるユーザー名を示します。これは醜いコードであり、おそらく最も効率的な解決策ではないことは承知していますが、これが期待どおりの出力であるかどうかをお知らせください。
#!/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;