Eine einfache Möglichkeit, doppelte (bzw. mehrfach vorhandene) Einträge aus einem Array zu entfernen.
my %seen; my @filtered = grep { !$seen{$_}++ } @array;
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 }, $_; }
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[$_]); }
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]; } }
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"; }
Damit ein Kommandozeilen-Skript unter Windows die deutschen Umlaute korrekt anzeigt, muß vor der Ausgabe nur folgendes aufgerufen werden.
binmode(STDOUT, ":encoding(cp850)");
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; }