#!/usr/bin/perl use strict; use Fcntl ':flock'; use Getopt::Std; use version; our $VERSION = qv('0.1_2'); require "$ENV{INTERNETSITE_LOCAL_CGI_DIR}/skripte/Util/String.pm"; require "$ENV{INTERNETSITE_LOCAL_CGI_DIR}/skripte/Util/System.pm"; my %commandline_option = (); getopts( 'f:l:cs', \%commandline_option ); my $SCRIPT_NAME = Util::System::basename(); my $TEXT_FILENAME = $commandline_option{f}; my $WORDLIST_FILENAME = $commandline_option{l}; my $READ_STDIN = $commandline_option{c}; my $SILENT = $commandline_option{s}; my @wordlist = (); check_options(); read_wordlist(); if ($READ_STDIN) { read_stdin(); } else { read_textfile(); } exit $SILENT ? 1 : 0; sub read_stdin { open my $stdin_h, '-' or die "Kann nicht von der Standardeingabe lesen!\n"; read_lines($stdin_h); close $stdin_h; } sub read_textfile { open my $fh_textfile, '<', $TEXT_FILENAME or die "Textdatei '${TEXT_FILENAME}' laesst sich nicht oeffnen!\n"; flock $fh_textfile, LOCK_SH or die "Textdatei '${TEXT_FILENAME}' laesst sich nicht sperren!\n"; read_lines($fh_textfile); close $fh_textfile; } sub read_lines { my ($input_h) = @_; my $line_number = 1; my $input_string = defined $TEXT_FILENAME ? "'${TEXT_FILENAME}': " : ""; while (my $line = <$input_h>) { foreach my $word (@wordlist) { if ($line =~ /(\W|^)$word(\W|$)/i) { exit 0 if $SILENT; print "${SCRIPT_NAME}: ${input_string}Zeile ${line_number} enthaelt '${word}'\n"; } } $line_number++; } } sub read_wordlist { open my $fh_wordlist, '<', $WORDLIST_FILENAME or die "Wortliste '${WORDLIST_FILENAME}' laesst sich nicht oeffnen!\n"; flock $fh_wordlist, LOCK_SH or die "Wortliste '${WORDLIST_FILENAME}' laesst sich nicht sperren!\n"; while (my $line = <$fh_wordlist>) { Util::String::trim(\$line); push @wordlist, $line; } close $fh_wordlist; } sub check_options { check_wordlist(); if (!$READ_STDIN) { check_textfile(); } } sub check_textfile { die "${SCRIPT_NAME}: Angabe der Textdatei fehlt (Parameter -f)!\n" if not defined $TEXT_FILENAME; die "${SCRIPT_NAME}: Textdatei und Wortliste muessen verschieden sein!\n" if $TEXT_FILENAME eq $WORDLIST_FILENAME; die "${SCRIPT_NAME}: Textdatei '${TEXT_FILENAME}' existiert nicht!\n" if not -f $TEXT_FILENAME; } sub check_wordlist { die "${SCRIPT_NAME}: Angabe der Wortliste fehlt (Parameter -l)!\n" if not defined $WORDLIST_FILENAME; die "${SCRIPT_NAME}: Wortliste '${WORDLIST_FILENAME}' existiert nicht!\n" if not -f $WORDLIST_FILENAME; } __END__ =head1 NAME findwords.pl - Findet in Texten Wörter und Wortfolgen, die in einer Wortliste stehen =head1 SYNOPSIS findwords.pl <-c | -f text.txt> <-l wordlist.txt> [-s] =head1 DESCRIPTION Das Skript C indet in Texten Wörter und Wortfolgen, die in einer Wortliste stehen. So könnte beispielsweise festgestellt werden, ob ein Text Wörter enthält, die dort nicht stehen sollten, beispielsweise abgedroschene Phrasen. Werden ein Wort oder eine Wortfolge gefunden, werden diese ausgegeben mit der betroffenen Zeilennummer. Enthält der Text keines der gesuchten Wörter oder Wortfolgen, wird nichts ausgegeben. =head1 OPTIONS =over =item -c Liest den Text von der Standardeingabe; hat Vorrang gegenüber C<-f> =item -f Textdatei, die geprüft werden soll =item -l Textei (Liste) mit zu suchenden Wörtern und Wortfolgen. Die einzelnen Wörter und Wortfolgen stehen zeilenweise untereinander; der Trenner ist das Newline-Zeichen. =item -s Gibt nichts aus und liefert statt dessen 0 als Rückgabewert, wenn ein Wort oder eine Wortfolge aus der Liste gefunden wurden oder 1, falls nichts gefunden wurde (s: Silent) =back =head1 AUTHOR Elmar Baumann 2009/02/14 =cut