25

while ステートメント中に要素を配列にプッシュしています。各要素は教師の名前です。ループが終了すると、配列内に教師名が重複することになります。配列内で互いに隣り合っていない場合もあれば、隣り合っている場合もあります。

値がプッシュされた後、その配列内の一意の値のみを出力するにはどうすればよいですか? 要素を印刷するたびに配列全体を解析する必要はありません。

すべてが配列にプッシュされた後のコードは次のとおりです。

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
4

10 に答える 10

42
use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
    print $_, "\n";
}
于 2009-01-13T16:48:18.723 に答える
33

あなたの最善の策は、 uniq ( innaM で説明されているように) のような(基本的に)組み込みツールを使用することです。

uniq を使用する能力がなく、順序を維持したい場合は、grep を使用してそれをシミュレートできます。

my %seen;
my @unique = grep { ! $seen{$_}++ } @faculty;
# printing, etc.

これにより、最初に各キーが各エントリであるハッシュが得られます。次に、各要素を繰り返し処理し、それらの数を数えて、最初の要素を追加します。(brian d foy のコメントで更新)

于 2009-01-13T16:58:37.267 に答える
14

ハッシュにプッシュすることをお勧めします。このような:

my %faculty_hash = ();
foreach my $facs (@faculty) {
  $faculty_hash{$facs} = 1;
}
my @faculty_unique = keys(%faculty_hash);
于 2009-01-13T16:24:00.537 に答える
5
@array1 = ("abc", "def", "abc", "def", "abc", "def", "abc", "def", "xyz");

@array1 = grep { ! $seen{ $_ }++ } @array1;

print "@array1\n"; 
于 2012-04-02T06:36:13.203 に答える
5

この質問には、perldoc の複数のソリューションで回答されています。コマンドラインで次のように入力するだけです:

perldoc -q duplicate
于 2012-07-25T14:16:10.073 に答える
4

注意: ハッシュを含む回答の一部は、配列の順序を変更します。ハッシュには順序がないため、キーまたは値を取得すると、順序が未定義のリストが作成されます。

これには当てはまりませんgrep { ! $seen{$_}++ } @faculty

于 2013-10-01T12:46:55.253 に答える
3

これは、固有の行を表示順に出力するためのワンライナー コマンドです。

perl -ne '$seen{$_}++ || print $_' fileWithDuplicateValues
于 2011-12-08T01:03:27.210 に答える
2

順序を気にしない場合にのみ役立つ別の方法です。

my %hash;
@hash{@faculty}=1;
my @unique=keys %hash;

新しい変数の宣言を避けたい場合は、何らかの理由で文書化されていないグローバル変数%_を使用できます

@_{@faculty}=1;
my @unique=keys %_;
于 2013-10-01T13:17:11.323 に答える