Perl Snippets


Arrays

Doppelte Einträge aus Array entfernen

Eine einfache Möglichkeit, doppelte (bzw. mehrfach vorhandene) Einträge aus einem Array zu entfernen.

my %seen;
  my @filtered = grep { !$seen{$_}++ } @array;

2 Arrays vergleichen

Dieses Beispiel zeigt, wie einfach man mit Perl die Schnittmenge, Differenzmenge oder die Vereinigungsmenge der Elemente zweier Listen erstellen kann.

my (@union, @intersec, @diff, %count);
  $count{$_}++ for (@array1, @array2);
  for (keys %count) {
    push @union, $_;
    push @{ $count{$_} > 1 ? @intersec : @diff }, $_;
  }

Array Element in einer for Schleife entfernen

Um Elemente, die einem bestimmten Kriterium entsprechen, aus einem Array zu entfernen, empfiehlt sich die Funktion grep.

Manchmal stößt man aber erst während der Verarbeitung auf "ungewünschte"Elemente, z.B. beim Durchlaufen der Liste mit foreach. In diesem Fall ist splice euer Freund.

for (reverse 0 .. $#a) {
    splice @a, $_, 1 if condition($a[$_]);
  }

Zeilen und Spalten eines 2-dimensionalen Arrays tauschen

Um eine Tabelle in einem 2-dimensionalen Array zu transponieren, genügen zwei einfache Schleifen.

my @inverted_table;
for my $y (0 .. $#table) {
  for my $x (0 .. $#{$table[$y]}) {
    $inverted_table[$x][$y] = $table[$y][$x];
  }
}

Windows

Default Browser unter Windows starten

Möchte man eine URL oder HTML Seite unter Windows im Standardbrowser anzeigen lassen, hilft nur ein Windows API Aufruf.

use Win32 qw(SW_SHOWNORMAL);
  use Win32::API;
  my $sh = Win32::API->new('shell32', 'ShellExecute', 'NPPPPI', 'N')
  or die "cannot import ShellExecute: $!n";
  my $url = 'http://perlmania.de';
  my $ret = $sh->Call(0, 'open', $url, '', '.', SW_SHOWNORMAL);
  if ($ret < 33) {
    print STDERR Win32::FormatMessage($ret), "n";
  }

Deutsche Umlaute in der Windows Kommandozeile

Damit ein Kommandozeilen-Skript unter Windows die deutschen Umlaute korrekt anzeigt, muß vor der Ausgabe nur folgendes aufgerufen werden.

binmode(STDOUT, ":encoding(cp850)");

Sonstiges

EAN Prüfziffer berechnen

Hier ein kleines Skript, mit dem man die Prüfziffer eines EAN Codes berechnen kann.

if ($ean =~ /^d{7}(d{5})?$/) {
    my @bit = reverse split //, $ean;
    my $pbit;
    for (my $i=0; $i<=$#bit; $i++) {
      $pbit += ($i+1)%2 > 0 ? 3 * $bit[$i] : $bit[$i];
    }
    printf "Parity Bit: %dn", (10-($pbit%10))%10;
  }