Da ist ein kleiner Fehler drin: Selbst wenn eine Zeile kein solches Datum enthält, wird ein Datum ausgegeben - wenn vorher eins gefunden wird. Das ist ist ein vereinfachtes Beispiel:
#!/usr/bin/perl
use strict;
use warnings;
my $line = 'test';
$line =~ /(es)/;
while( $line = <DATA> ){
$line =~ /(es)/;
print $1 if $1;
}
__DATA__
1
2
Wenn der Reguläre Ausdruck nicht matcht, werden die Variablen $1,$2,... nicht auf undef gesetzt, sondern behalten den Wert vom letzten Regulären Ausdruck, der gematcht hat.
Deshalb sollte es so gemacht werden:
if( $match =~ /(\d{1,2}(\-|\/|\.)\d{1,2}\2\d{4})/ ){
print "$1\n";
}
oder damit es besser lesbar wird
if( my ($date) = $match =~ /(\d{1,2}(\-|\/|\.)\d{1,2}\2\d{4})/ ){
print "$date\n";
}
Jetzt muss der OP nur noch wissen, ob auch mehrere Datumsangaben in einer Zeile vorkommen können. Dann muss das etwas angepasst werden.
Datum: 20.01.2009-14:40
