Skeeve: Array-Referenzen

Beitrag lesen

Moin!

Als nächsten Schritt muss ich doppelt vorkommende Strings entfernen und die Vorkommen zählen.

my %saw; grep !$saw{( split/;/,$_)[0]}++ , @inhalt;

Das ist aber sehr unschön!

grep und map sollte man nicht verwenden, wenn man das Ergebnis nachher verwirft. Wenn man es denn unbedingt verwenden will, aber kein Ergebnis benötigt, dann sollte man beim grep auch ein undef oder eine 0 liefern. Zudem kann man dem Split mitteilen, daß beim ersten ; Schluß ist.

Hier mal ein paar Varianten:

  
use Data::Dumper;  
my @inhalt= ( 'a;1;1', 'a;2;2', 'b;1;1', 'b;2;2' );  
  
{ # Deine Version  
 my %saw;  
 grep  !$saw{( split/;/,$_)[0]}++ , @inhalt;  
  
 print Dumper \%saw;  
}  
  
{ # Variante, die kein unnötiges Ergebnis aufbaut  
  # und beim ersten ; aufhört zu splitten  
 my %saw;  
 grep  { ++$saw{( split/;/,$_,2)[0]}; 0; } @inhalt;  
  
 print Dumper \%saw;  
}  
  
{ # Variante ganz ohne unnötiges Zwischenergebnis  
 my %saw;  
 ++$saw{ $_ } foreach (  map { (split /;/,$_,2)[0] } @inhalt );  
  
 print Dumper \%saw;  
}  
  
{ # Oder so, um es vielleicht deutlicher zu machen, was abläuft  
 my %saw;  
 foreach ( @inhalt ) {  
  my ($akz)= split /;/, $_, 2;  
  ++$saw{ $akz };  
 }  
  
 print Dumper \%saw;  
}  
  
{ # und hier eine Variante die aufs Zählen verzichtet.  
  # Praktisch, wenn man nicht an der Anzahl der Vorkommen  
  # interessiert ist  
 my %saw;  
 @saw{ map { (split /;/,$_,2)[0] } @inhalt }= ();  
  
 print Dumper \%saw;  
}  

-- Skeeve