Perl配列の一意の要素を印刷するにはどうすればよいですか?
質問
whileステートメントの間に要素を配列にプッシュしています。各要素は教師の名前です。ループが終了すると、配列内で教師名が重複します。配列内で隣接していない場合もあれば、隣接している場合もあります。
値のプッシュが完了した後、その配列の一意の値のみを印刷するにはどうすればよいですか?要素を出力するたびに配列全体を解析する必要はありません。
すべてが配列にプッシュされた後のコードは次のとおりです。
$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
printf $fh '"'.$faculty[$i].'"';
$i++;
}
解決
use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
print <*>, "\n";
}
他のヒント
最善の策は、uniq( innaMの説明どおり)などの(基本的に)組み込みツールを使用することです。 >。
uniqを使用する能力がなく、順序を保持したい場合は、grepを使用してそれをシミュレートできます。
my %seen;
my @unique = grep { ! $seen{最善の策は、uniq( innaMの説明どおり)などの(基本的に)組み込みツールを使用することです。 >。
uniqを使用する能力がなく、順序を保持したい場合は、grepを使用してそれをシミュレートできます。
<*>
これはまず、各キーが各エントリであるハッシュを提供します。次に、各要素を反復処理して、要素の数を数え、最初の要素を追加します。 (brian d foyによるコメントで更新)
}++ } @faculty;
# printing, etc.
これはまず、各キーが各エントリであるハッシュを提供します。次に、各要素を反復処理して、要素の数を数え、最初の要素を追加します。 (brian d foyによるコメントで更新)
ハッシュにプッシュすることをお勧めします。 このように:
my %faculty_hash = ();
foreach my $facs (@faculty) {
$faculty_hash{$facs} = 1;
}
my @faculty_unique = keys(%faculty_hash);
@array1 = ("abc", "def", "abc", "def", "abc", "def", "abc", "def", "xyz");
@array1 = grep { ! $seen{ <*> }++ } @array1;
print "@array1\n";
この質問は、perldocの複数のソリューションで回答されています。コマンドラインで入力するだけです:
perldoc -q duplicate
注意:ハッシュを含む回答の一部は、配列の順序を変更します。ハッシュにはどんな種類の順序もありませんので、キーまたは値を取得すると、順序が未定義のリストが作成されます。
これは、 grep {! $ seen {$ _} ++} @faculty
これは、一意の行を表示順に印刷する1行のコマンドです。
perl -ne '$seen{これは、一意の行を表示順に印刷する1行のコマンドです。
<*>}++ || print これは、一意の行を表示順に印刷する1行のコマンドです。
<*>' fileWithDuplicateValues
ハックニー3ライナーを見つけました。楽しんでください
my %uniq;
undef @uniq(@non_uniq_array);
my @uniq_array = keys %uniq;
それを行うもう1つの方法です。順序を気にしない場合にのみ便利です:
my %hash;
@hash{@faculty}=1;
my @unique=keys %hash;
新しい変数の宣言を避けたい場合は、何らかの形で文書化されていないグローバル変数%_ <を使用できます。 / a>
@_{@faculty}=1;
my @unique=keys %_;
何らかの方法で教員リストを処理する必要がある場合は、キーの合体およびキーのソートのためにハッシュに変換された配列上のマップが別の良い方法です:
my @deduped = sort keys %{{ map { /.*/? (
任意に複雑。何らかの方法で教員リストを処理する必要がある場合は、キーの合体およびキーのソートのためにハッシュに変換された配列上のマップが別の良い方法です:
my @deduped = sort keys %{{ map {/.*/? do{s/\.//g; (
何らかの方法で教員リストを処理する必要がある場合は、キーの合体およびキーのソートのためにハッシュに変換された配列上のマップが別の良い方法です:
my @deduped = sort keys %{{ map { /.*/? (
任意に複雑。何らかの方法で教員リストを処理する必要がある場合は、キーの合体およびキーのソートのためにハッシュに変換された配列上のマップが別の良い方法です:
my @deduped = sort keys { map { /.*/? (s/\.//gr,1):() } @faculty };
選択に応じて
/.*/
正規表現を変更してリストを処理します。それに応じて、パスごとに1つ以上の変更された一意でないキーを出力できます。 ($ _、1):()置換正規表現を使用して実行中のデータを変更する必要がある場合、名前(
<*>s /\.// g
)からドットを削除するなど、上記のパターンによる置換$ _
エイリアシングにより、元の@faculty
配列を変更します。@faculty
配列の匿名コピーを作成することで、$ _
エイリアスを回避できます(いわゆる&quot; baby cart&quot; operator ):Perlの最新バージョンでは、
<*>keys
にハッシュ参照を渡すことができ、非破壊的な置換を使用できます:それ以外の場合は、他の場所での
,1):() } @faculty }}; print join("\n", @deduped)."\n";grep
または$ seen [$ _] ++
ソリューションが望ましい場合があります。選択に応じて
/.*/
正規表現を変更してリストを処理します。それに応じて、パスごとに1つ以上の変更された一意でないキーを出力できます。 ($ _、1):()置換正規表現を使用して実行中のデータを変更する必要がある場合、名前(
<*>s /\.// g
)からドットを削除するなど、上記のパターンによる置換$ _
エイリアシングにより、元の@faculty
配列を変更します。@faculty
配列の匿名コピーを作成することで、$ _
エイリアスを回避できます(いわゆる&quot; baby cart&quot; operator ):Perlの最新バージョンでは、
<*>keys
にハッシュ参照を渡すことができ、非破壊的な置換を使用できます:それ以外の場合は、他の場所での
,1)}:()} @{[ @faculty ]} }}; print join("\n", @deduped)."\n"; print "Unmolested array:\n".join("\n", @faculty)."\n";grep
または$ seen [$ _] ++
ソリューションが望ましい場合があります。
選択に応じて /.*/
正規表現を変更してリストを処理します。それに応じて、パスごとに1つ以上の変更された一意でないキーを出力できます。 ($ _、1):()任意に複雑。
置換正規表現を使用して実行中のデータを変更する必要がある場合、名前( s /\.// g
)からドットを削除するなど、上記のパターンによる置換 $ _
エイリアシングにより、元の @faculty
配列を変更します。 @faculty
配列の匿名コピーを作成することで、 $ _
エイリアスを回避できます(いわゆる&quot; baby cart&quot; operator ):
Perlの最新バージョンでは、 keys
にハッシュ参照を渡すことができ、非破壊的な置換を使用できます:
それ以外の場合は、他の場所での grep
または $ seen [$ _] ++
ソリューションが望ましい場合があります。
選択に応じて /.*/
正規表現を変更してリストを処理します。それに応じて、パスごとに1つ以上の変更された一意でないキーを出力できます。 ($ _、1):()任意に複雑。
置換正規表現を使用して実行中のデータを変更する必要がある場合、名前( s /\.// g
)からドットを削除するなど、上記のパターンによる置換 $ _
エイリアシングにより、元の @faculty
配列を変更します。 @faculty
配列の匿名コピーを作成することで、 $ _
エイリアスを回避できます(いわゆる&quot; baby cart&quot; operator ):
Perlの最新バージョンでは、 keys
にハッシュ参照を渡すことができ、非破壊的な置換を使用できます:
それ以外の場合は、他の場所での grep
または $ seen [$ _] ++
ソリューションが望ましい場合があります。