0

次のプログラムを実装する方法を知りたいです。ファイルを調べて、複数の人のフルネームに含まれる名前を検索し、それらの人のフルネームを出力し
たいと思います。 これまでのところ、ファイルからユーザー名と対応する ID を出力できます。しかし、ファイル全体で複数回のユーザー名の出現を効率的に検索する方法がわかりません。例えば/etc/passwd
/etc/passwd

  1. @lines: この配列には/etc/passwdファイル データが含まれます
  2. 次に、配列の各行からユーザー名を抽出しています@lines
  3. ここで、残りのリストでこのユーザー名 (手順 2 で見つかった) を検索し、ユーザー名が見つかった場合は、それらのフル ネームを出力します。

ステップ3をどのように実装すればよいかわかりません。

どんな助けと指導も素晴らしいでしょう...

たとえば、/etc/passwd ファイルには次のフルネームが保存されています。出力で。

出力は 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 に答える