Frage

Ich Elemente in ein Array während einer while-Anweisung schieben. Jedes Element ist ein Name des Lehrers. Es endet als doppelte Lehrernamen im Array, wenn die Schleife beendet. Manchmal sind sie nicht direkt nebeneinander in der Anordnung, manchmal sind sie.

Wie kann ich drucken nur die eindeutigen Werte in diesem Array nach seinen fertig bekommen Werten hinein geschoben? Ohne das gesamte Array jedes Mal zu analysieren Ich mag ein Element drucken.

Heres der Code nach dem alles wurde in das Array geschoben:

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

Lösung

use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
    print $_, "\n";
}

Andere Tipps

Ihre beste Wette wäre, ein (im Wesentlichen) integriertes Tool zu verwenden, wie uniq ( wie INNAM beschrieben) .

Wenn Sie nicht über die Fähigkeit, uniq zu verwenden und wollen, um zu erhalten, können Sie grep verwenden, um das zu simulieren.

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

Dies gibt Ihnen zunächst einen Hash, wo jeder Schlüssel jeder Eintrag ist. Dann iterieren Sie über jedes Element, zu zählen, wie viele von ihnen gibt es, und das Hinzufügen der ersten. (Aktualisiert mit Kommentaren von Brian D Foy)

Ich schlage vor, es in einen Hash schieben. wie folgt aus:

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"; 

Diese Frage ist mit mehreren Lösungen in perldoc beantwortet. Geben Sie einfach auf der Kommandozeile:

perldoc -q duplicate

Bitte beachten Sie: Einige der Antworten einen Hash enthält, wird die Reihenfolge der Anordnung ändern. Hashes nicht jede Art von Auftrag hat, so die Schlüssel oder Werte bekommt eine Liste mit einer nicht definierten Reihenfolge machen.

Dieses doen't gelten grep { ! $seen{$_}++ } @faculty

Dies ist ein Einzeiler Befehl einzigartige Linien zu drucken, um es angezeigt wird.

perl -ne '$seen{$_}++ || print $_' fileWithDuplicateValues

Ich habe gerade abgedroschen 3-Liner, genießen

my %uniq; 
undef @uniq(@non_uniq_array); 
my @uniq_array = keys %uniq; 

Nur einen anderen Weg, es zu tun, nützliche nur, wenn Sie Auftrag nicht kümmern :

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

Wenn Sie eine neue Variable deklarieren vermeiden wollen, können Sie das irgendwie underdocumented globale Variable verwenden % _

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

Wenn Sie die Fakultät Liste in irgendeiner Weise verarbeiten müssen, eine Karte über das Array auf einen Hash für Schlüssel Koaleszierstruktur umgewandelt und dann Tasten Sortierung ist ein weiterer guter Weg:

my @deduped = sort keys %{{ map { /.*/? ($_,1):() } @faculty }};
print join("\n", @deduped)."\n";

Sie bearbeiten die Liste die /.*/ regex Wechsel zum Auswählen oder das Parsen und die Erfassung entsprechend, und Sie können Ausgang eines oder mehrere mutierte, nicht eindeutige Schlüssel pro Pass von ($_,1):() beliebig komplex zu machen.

Wenn Sie die Daten im Flug mit einer Substitution regex ändern, sagen Punkte aus dem Namen (s/\.//g) zu entfernen, dann eine Substitution nach dem obigen Muster wird den ursprünglichen @faculty Array mutiert aufgrund $_ Aliasing. Sie können, indem sie eine anonyme Kopie des $_ Array (siehe die so genannten @faculty Aliasing erhalten rel = "nofollow"> "baby Wagen" Operator ):

my @deduped = sort keys %{{ map {/.*/? do{s/\.//g; ($_,1)}:()} @{[ @faculty ]} }};
print join("\n", @deduped)."\n";
print "Unmolested array:\n".join("\n", @faculty)."\n";

In den neueren Versionen von Perl, können Sie keys eine hashref passieren, und Sie können die nicht-destruktive Substitution verwenden:

my @deduped = sort keys { map { /.*/? (s/\.//gr,1):() } @faculty };

Im übrigen ist die grep oder $seen[$_]++ Lösungen an anderer Stelle können bevorzugt sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top