#! /usr/bin/env perl use strict; use warnings; use 5.012; # Datei der Stichworte (1 pro Zeile) wird als Argument uebergeben my $FILE_KEYWORDS = shift(@ARGV) || die "Keine Stichwort-Datei angegeben.\n"; # Dateien der Mitarbeiter werden aus aktuellem Verzeichnis gelesen my @FILES = glob( 'id*.txt' ); #> sub routines #> -------------------------------------------------------------------------- # lese Stichwort-Datei und liefere Liste der Stichworte sub read_keywords { my $fname = shift; open( my $fh, '<', $fname ) or die "open($fname) fehlgeschlagen: $!"; my @kw = <$fh>; chomp @kw; close $fh; return @kw; } sub join_for_regex { return join( '|', map { qr/\Q$_\E/ } # Sortierung und Reihenfolge ist wichtig! sort { length($b) <=> length($a) } @_ ); } # nur einfache Daten, also bauen wir eine einfache CSV-Ausgabe # bei komplexeren Daten sollte ein Text::CSV Modul aus CPAN # installiert und verwendet werden sub print_csv { say join ';', @_; } #> main program #> -------------------------------------------------------------------------- my @keywords = read_keywords($FILE_KEYWORDS); my $regexp = join_for_regex( @keywords ); # CSV Kopfzeile ausgeben print_csv( 'Personalnummer', @keywords ); FILE: for my $datafile ( @FILES ) { my $fh; # Wenn Datei nicht lesbar, Warnung geben und weiter mit naechster Datei if ( ! open $fh, '<', $datafile ) { warn "open($datafile) fehlgeschlagen: $!"; next FILE; } # initialisiere die Zaehler der Stichworte mit 0 (Null) my %result = map { $_ => 0 } @keywords; # zeilenweise einlesen while ( my $line = <$fh> ) { if ( $line =~ m/Personalnummer: (\d+)/ ) { $result{id} = $1; } else { # Vorkommen der Stichworte hochzaehlen while ( $line =~ m/($regexp)/ig ) { $result{$1}++; } } } close $fh; # CSV Datenzeile ausgeben; pro Mitarbeiter/Datendatei print_csv( @result{ 'id', @keywords } ); } __END__