Ich versuche herauszufinden, die richtige PBP genehmigte Möglichkeit, eine Multi-Line-String Zeile für Zeile zu verarbeiten. Viele Perl-Codierer schlagen vor, die mehrzeilige Zeichenfolge als Dateihandle zu behandeln, was gut funktioniert, wenn Sie in Ihrem Skript nicht "use strict" verwenden. Dann erhalten Sie vom Compiler eine Warnung, dass Sie keine Zeichenfolge als Symbol verwenden dürfen, während strikte Referenzen verwendet werden.Wie kann ich eine mehrzeilige Zeichenfolge Zeile für Zeile in Perl verarbeiten?
Hier ist ein einfaches Ausführungsbeispiel des Problems:
#use strict;
use warnings;
my $return = `dir`;
my $ResultsHandle = "";
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
if ($resultLine =~ m/joe/) {
$matchLines = $matchLines . "\t" . $resultLine;
}
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";
Beachten Sie, dass die "use strict" Line-Out wird kommentiert. Als ich dieses Skript ohne Verwendung streng laufen, bekomme ich, was ich will und erwarten:
Original string:
Volume in drive D has no label.
Volume Serial Number is 50D3-54A6
Directory of D:\Documents and Settings\username\My Documents\Eclipse\myTestProject
09/18/2009 11:38 AM <DIR> .
09/18/2009 11:38 AM <DIR> ..
09/18/2009 11:36 AM 394 .project
09/18/2009 11:37 AM 0 joe.txt
09/18/2009 11:37 AM 0 joey.txt
09/18/2009 11:38 AM 0 kurt.txt
09/18/2009 11:43 AM 497 main.pl
09/18/2009 11:38 AM 0 shane.txt
6 File(s) 891 bytes
2 Dir(s) 6,656,188,416 bytes free
Found these matching lines:
09/18/2009 11:37 AM 0 joe.txt
09/18/2009 11:37 AM 0 joey.txt
Hier ist das Problem, though. Als ich die "use strict" Zeile Kommentar-, erhalte ich die folgende Warnung oder einen Fehler von Perl:
Can't use string ("") as a symbol ref while "strict refs" in use at D:/Documents and Settings/username/My Documents/Eclipse/myTestProject/main.pl line 8.
Linie 8 die "offen $ ResultsHandle, '<', \ $ return;" Linie, nebenbei bemerkt. Da Perl Best Practices mich dazu zwingen, strict zu verwenden, wie erwartet PBP, dass ich eine Multiline-Zeichenkette Zeile für Zeile verarbeite? Irgendwelche Vorschläge von der SO-Community?
Danke!
Wenn Sie sich über Best Practices wollen reden, ich schlage vor, Sie bei all Ihren Variableninitialisierung einen Blick darauf werfen, auf die Art und Weise Sie Variablen definieren, wie in altmodischer C (an der Spitze), und Ihre Verwendung von Backticks für etwas, das von Perl selbst leicht erreicht werden kann. – innaM
Danke, Manni. Der Abruf von Verzeichnisinhalten diente nur zu Demonstrationszwecken. Mein aktuelles Programm ruft tatsächlich ein anderes Programm auf und verarbeitet seine Ausgabe. Und die altmodische variable Initialisierung ist etwas, an dem ich mehr arbeiten muss. Aber ich schneide oft aus alten Skripten und füge das ein. :-) Ich versuche es aber besser zu machen. –