while (<FILE>){ @Input = <FILE>; }
Das macht nicht viel Sinn machen. "Während Sie einen Datensatz aus FILE lesen können, lesen Sie alle Daten von FILE in @Input
". Ich denke, was Sie wirklich wollen, ist einfach:
my @Input = <FILE>;
if (@Input =~ /header2/){
Auch dies recht seltsam. Der Bindungsoperator (=~
) erwartet skalare Operanden, also wertet er beide Operanden im skalaren Kontext aus. Das heißt, @Input
wird als Anzahl der Elemente in @Input
ausgewertet. Das ist eine Ganzzahl und wird niemals "header2" entsprechen.
Ein paar Ansätze. Erstens ein Regex-Ansatz.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my $file = 'file';
open my $fh, '<', $file or die $!;
my $data = join '', <$fh>;
if ($data =~ /header2.+var3 (.+?)\n/s) {
say $1;
} else {
say 'Not found';
}
Der Schlüssel dazu ist die /s
auf dem m//
Betreiber. Ohne es werden die zwei Punkte in der Regex Newline nicht übereinstimmen.
Der andere Ansatz ist eher eine Zeile für Zeile Parser.
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my $file = 'file';
open my $fh, '<', $file or die $!;
my $section = '';
while (<$fh>) {
chomp;
# if the line all word characters,
# then we've got a section header.
if ($_ !~ /\W/) {
$section = $_;
next;
}
my ($key, $val) = split;
if ($section eq 'header2' and $key eq 'var3') {
say $val;
last;
}
}
Wir lesen die Datei Zeile für Zeile und notieren die Abschnittsüberschriften. Bei Datenzeilen teilen wir Leerzeichen auf und prüfen, ob wir im richtigen Abschnitt sind und den richtigen Schlüssel haben.
In beiden Fällen habe ich zu einem Standardansatz (lexikalische Dateihandles, 3-Arg open()
, or die $!
) zum Öffnen der Datei gewechselt.
"* aber ich denke, es ist nicht möglich, Multiline-Parsing richtig zu behandeln *" - Wenn Sie mehr von Ihrem tatsächlichen Code zeigen, könnte dieses Problem vielleicht gelöst werden? Es gibt wahrscheinlich eine einfache Lösung, ohne komplizierte Regexes verwenden zu müssen. "Jetzt denke ich daran, die Datei sofort zu analysieren, war aber bisher nicht erfolgreich ... *" - Können Sie erklären, wie das für Sie nicht funktioniert? In diesem Snippet gibt es eine Reihe von Problemen, die jedoch nicht mit dem Problem in Ihrem Titel zusammenhängen (Regexes mit Lookbehind). Siehe auch https://perlmaven.com/slurp für wertvolle Hinweise. – amon