use 5.028; use warnings; my %found; my @lines; LINE: while (my $line = ) { push @lines,$line; $line =~ /Wort1 Wort2 (\S+)/ and do { $found{String1} = $1; next LINE; }; $line =~ /Wort3 Wort4 (\d+)/ and do { $found{Zahl1} = $1; next LINE; }; if (exists $found{String1}) { $line =~ /Wort6 Wort7 \Q$found{String1}\E/ and do { BACKWARDS: for my $backwards (reverse @lines) { if ($backwards =~ /Wort5 (.*)/) { $found{String2} = $1; last BACKWARDS; } } }; next LINE; } } say "Gefunden:"; for my $key (sort keys %found) { say " $key = $found{$key}"; } __DATA__ … … … ziemlich viele Zeilen mit uninteressantem Inhalt …. … … Wort1 Wort2 $string1 # diese Zeile wird verändert wieder ausgegeben … 0 bis 4 Zeilen mit Text … Wort3 Wort4 12345 # die Zahl1 wird noch mehrmals für ausgaben benötigt … … … ziemlich viele Zeilen und dann eine sehr ähnliche Aufgabe nur das diesmal die auszulesende Zeile VOR dem $String1 steht: … Wort5 # dieser string darf nicht ausgelesen werden (steht >1 Stellen von $string1 entfernt) Wort5 # String2 wird später benötigt (steht vor dem $string1) …. …einige Zeilen … Wort6 Wort7 $string1 # Zeile die den Suchstring $string1 enthält … …Weitere Zeilen… ….