2012-04-02 16 views
-2

Ich bin mit dem folgenden Code:Perl - Datei Schlürfen Ausgabe

open my $fh, "<", $file; 

$/ = undef; 
my $report = <$fh>; 
$/ = "\n"; 

close $fh; 

print("$report\n\n"); 

$ file bezieht sich auf eine Textdatei, die wie folgt aussieht:

a 1 
b 2 
c 3 

ich diesen Code lief auf zwei verschiedenen Linux Boxen. Einer von ihnen gab mir die erwartete Ausgabe (genau wie es in der Textdatei erscheint). Der andere gab mir diese statt:

GLOB(0x80f1174) 

... die mich effektiv verhindert weiter den Inhalt zu manipulieren.

Ich überprüfte die Perl-Versionen - die eine gibt mir die erwartete Ausgabe ist 5.10, während die andere 5.8 ist. Allerdings habe ich genau den gleichen Code gegen ähnliche Dateien in der Vergangenheit mit 5.8 ausgeführt, die funktionierten.

Ich habe auch versucht, die Datei von DOS nach UNIX zu konvertieren über: set ff = unix, aber ohne Erfolg.

+1

Sie würden Ausgabe wie 'GLOB (0x80f1174)' erhalten, wenn Zeile 4 'my $ result = $ fh' anstatt' my $ result = <$fh> 'sagte. – mob

+0

@mob Ich habe meinen Code überprüft - es verwendet <$fh>. – kaspnord

+0

@kaspnord, Dann Triple-Check. Vielleicht führen Sie die Datei nicht aus, von der Sie glauben, dass sie ausgeführt wird. – ikegami

Antwort

0

Ja, schreiben

<$fh> 

als fh $ zu Fehlern führen wird, wie $ fh nur die Datei-Handle ist. Das Drucken entspricht dem Drucken der Referenz. Wie die folgenden Codes führt das Schreiben als FH zum Laufzeitfehler.

open FH,$infile or die$!; 
while(<FH>){ 
    @line=split(/,/); 
    if($flag==0){ 
    foreach my $col (@line){ 
     $header{$col}=$count; 
     $count++; 
    } 
} 
} 
close(FH); 
4

Die gestrichelte Datei enthält keine

my $report = <$fh>; # aka: readline($fh) 

Vielleicht enthält es

my $report = $fh; 
my $report = < $fh >; # aka: glob(" $fh ") = " GLOB(0xXXXXXXX) " 
my $report = <$fh >; # aka: glob("$fh ") = "GLOB(0xXXXXXXX) " 
my $report = < $fh>; # aka: glob(" $fh") = " GLOB(0xXXXXXXX)" 

<> eine Abkürzung für readline oder glob ist (keine Beziehung zum Wort KLACKS im Ausgang). Die Räume machen es glob.

+0

Entschuldigung, ich verstehe nicht, was Sie mit meiner Datei meinen, die möglicherweise diese Variationen von <$fh> enthält - könnten Sie etwas mehr erklären? Ich wusste nicht, Variationen von <$fh> gab es sogar ... – kaspnord

+0

Siehe die ["I/O Operatoren" Abschnitt in perlop] (http://search.cpan.org/perldoc?perlop#I/O_Operators) – mob

+0

@ kaspnord, Ich nehme an, was Ihre Datei enthält, weil sie nicht enthält, was Sie gesagt haben. – ikegami

1

Ich würde empfehlen, nur das File::Slurp Modul aus dem CPAN zu verwenden. Dann könnte Ihr Code wie folgt aussehen:

use File::Slurp 'read_file'; 
my $file = '/path/to/some/file'; 
my $report = read_file $file; 
print("$report\n\n"); 

Viel besser lesbar und vorhersehbar, IMO.

0

Man kann Datei verwenden :: Slurp als Hercynium empfiehlt, der Mechanismus, der näher ist, was der OP geschrieben aussieht:

my $report = do { 
    open my $fh, '<', $file; 
    local $/; 
    <$fh>; 
}; 

Wenn auf diese Weise getan alle Änderungen sind Lokal der do Block, einschließlich Schließen des Dateihandles.

N.B. perldoc -f do sagt uns

tun BLOCK

Nicht wirklich eine Funktion. Gibt den Wert des letzten Befehls in der Befehlsfolge mit BLOCK zurück.

Hinweis weiter als der Kontext der letzten ausgeführten Anweisung ist der Kontext der do block (hier Skalar). Ich finde do Blöcke sehr nützlich (und zu wenig genutzt); Sie sind eine gute Möglichkeit, um einen lexikalischen Ausführungsblock zu haben, aber sie geben trotzdem leicht etwas an den äußeren Bereich zurück.