Monica y Stefan
Leonardo, Daniela

HomeFotosLeonardoDanielaKalenderPerl

Tipps und Tricks mit Arrays

Doppelte Elemente entfernen

%seen = ();
@list = grep { ! $seen{$_} ++ } @list;

oder mit map:

my @uniq = keys %{{ map {$_ => 1} @list }};

Doppelte Elemente entfernen (sehr schnell)

%seen = ();
@seen{@_} = 1;
@list = keys %all;

Achtung! Die Originalreihenfolge der Elemente geht verlohren.

Leere Elemente entfernen

@list = grep { $_; } @list;

Feststellen ob ein Element in einem Array vorhanden ist

$found = grep { $_ eq $element } @list;

Elemente finden die mehr als einmal vorkommen

%seen = ();
grep { ! $seen{$_} ++ } @list;
@list = grep { $seen{$_} > 1 } (keys %seen);

Alle Elemente finden die ein bestimmtes Kriterium erfüllen

@big = grep { $_ > 1000000 } @nums;

Elemente eines Arrays zufällig verteilen

sub fisher_yates_shuffle
  {
  my $array = shift; my $i;
  for ($i = @$array; --$i;)
    {
    my $j = int rand ($i+1);
    next if $i == $j;
    @$array[$i,$j] = @$array[$j,$i];
    }
  return(wantarray ? @array : @array);

 }

@shuffle = &fisher_yates_shuffle(@array);

Ab Perl 5.8.0 kann auch folgender Aufruf verwendet werden:

use List::Util 'shuffle';

@shuffle = shuffle(@aray);

Foreach über eine Referenz auf ein Array

@fruits = qw(Apfel Birne);
$fruit_ref = @fruits;
foreach (@{$fruit_ref})
  {
  print $_;
  }

Elemente löschen die ein bestimmtes Kriterium erfüllen

Zum löschen von Elementen aus einem Array steht mit splice ein mächtiges Werkzeug zur Verfügung.

Die allgemeine Syntax von splice ist:
splice(@array, $index, $numer_to_delete); Beschreibung von splice im Detail

Wenn die Elemente eines Array oder einer Liste manipuliert werden, sollte die Funktion foreach nicht verwendet werden. Als einfache Alternative bietet sich while an.

my $index = 0;
while ($index <= $#array)
  {
  if ($array[$index] eq 'kriterium') { splice(@array, $index, 1); }
  else { $index++; }
  }

Damit werden alle Elemente mit dam Inhalt 'kriterium' entfernt und das Array gekürzt.

Dateien eines Verzeichnisses einlesen

Mit der Funktion grep Dateien eines Verzeichnisses in ein Array einlesen.

Alle HTML (.htm, .html) Dateien einlsen:

@array = grep { /.html*$/i } readdir DIR;

Alle HTML (.htm, .html) Dateien einlsen, ohne Index-Datei(en):

@array = grep { /.html*$/i && !/^index./i } readdir DIR;

 

Tipps und Tricks mit mehreren Arrays

zum Inhalt