PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Subrutine Rekursiv anwenden



nidhoegg
19-04-2007, 11:32
Hallo, ich habe mir ein Skript geschrieben, welches alle Use- Anweisungen aus den .pl-Dateien eines Verzeichnisses herausziehen soll. Das funktioniert auch soweit gut.
Jetzt möchte ich gerne, dass das auch rekursiv funktioniert, aber leider bekomme ich in mein Output-File gar nichts hineingeschrieben.


open (EXF, ">>results.txt");
use File::Find;

sub erst () {
@liste = glob ("*.pm");
# Alles includes finden und in Datei schreiben
foreach (@liste){
open (INLIST, "$_");
print (EXF "$_ :\n");
while (<INLIST>){
if ($_ =~ /use/ && !($_ =~ /strict;/) && !(/^#/) ){
print (EXF);
}
}
print(EXF "\n");
}
}
# das root-Verzeichnis heisst "tests"
find (\&erst, 'tests');
Die Idee mit dem "find" habe ich aus dem Perl-Kochbuch.
Hat jemand eine Idee, was falsch läuft?

Grüße, nidhoegg

Molaf
19-04-2007, 20:56
Ich schätze, dass das Dateihandle EXF in der Subroutine nicht bekannt ist, deswegen passiert da nichts.
Teste das Skript doch mal mit use strict; und schau was es als Fehler ausgibt.
Zur not mußt Du dann eine Variable als Dateihandle nehmen und das dann der Sub jedesmal übergeben.

reneeb
20-04-2007, 08:49
Du solltest beachten, dass Du in der while-Schleife das $_ von der foreach-Schleife überschreibst. Außerdem schreibt das print (EXF) nicht in die Ausgabedatei, sondern schreibt auf STDOUT den stringifizierten Wert des Dateihandles EXF.

Das glob brauchst Du nicht...


In Perl sollte man keine Prototypen verwenden, außer man ist sich sicher was man machen will. Also die () hinter "sub erst" weglassen...


open my $exf, ">>","results.txt" or die $!;
use File::Find;

sub erst{
next unless $File::Find::name =~ /\.pm$/;
open my $fh,'<',$File::Find::name or die $!;
while( my $line = <$fh> ){
print $exf $line if $line =~ /^\s*[^#]\s*use\s+(?!strict)/;
}
close $fh;
}
# das root-Verzeichnis heisst "tests"
find (\&erst, 'tests');

Der Regulaere Ausdruck ist ungetestet...