2016-11-20 3 views
0

Ich verwende File::Find, um durch einen Verzeichnisbaum zu laufen, und wenn ich versuche, die aktuelle Datei zum Lesen zu öffnen, bekomme ich No such file or directory. Dies geschieht mit ALLEN Dateien in der Verzeichnisstruktur.open error - Keine solche Datei oder Verzeichnis

Hier ist der Unter ich im find() verwenden:

sub { 
    if (-d) { 
     return; 
    } 
    if (-f) { 
     my $file = ${File::Find::name}; 
     open (my $IN, '<', '$file') or die "$!\n"; 
     while (<$IN>) { 
      ### Do some formatting. 
     } 
     close $IN; 
    } 
} 

Es scheitert in der Zeile:

open (my $IN, '<', '$file') or die "$!\n"; 

Ich dachte, es vielleicht eine Frage der Links ist, sondern auch mit follow => 1 Option bekomme ich diese Error.

Übrigens, ohne follow ist der Fehler, den ich bekomme, auf der ersten Datei des ersten Verzeichnisses, das ich finde, und damit der Fehler auf der letzten Datei des letzten Verzeichnisses (aber in beiden Fällen ist es auf der ersten Datei geprüft von File::Find).

Antwort

2

Problem gelöst. Offensichtlich hat das Ersetzen der einfachen Anführungszeichen durch doppelte Anführungszeichen in der Zeile open, oder noch besser, ohne irgendwelche Anführungszeichen, den Trick gemacht. Das Zeichenfolgenliteral '$file' erzeugt die Zeichenfolge $file, und es gibt eindeutig keine Datei mit diesem Namen.

+5

'open (meine $ IN, '<', '$ file')' versucht eine Datei zu öffnen, die wörtlich 'dollar-f-i-l-e' heißt, weil die einzelnen Ticks ''' Variablen nicht interpolieren. Wie Sie bereits bemerkt haben, können Sie entweder doppelte Anführungszeichen '' 'verwenden (was interpoliert) oder (noch besser) keine davon verwenden und einfach' $ file' schreiben. – PerlDuck

+0

@PerlDuck wie Sie sehen können, habe ich es in meinem geschrieben Antwort :) Auch, nur '$ Datei' schreiben ist besser, kann nicht glauben, dass ich diese Option verpasst! – yonyon100

+0

@PerlDuck Kein Grund für Sie, es zu löschen, es ist in Ordnung – yonyon100

Verwandte Themen