2010-11-25 4 views
2

Auslösen, wenn der Code wie folgt ausgeführt werden:Mit Dumper keinen Fehler

use strict; 
print Dumper "something"; 

nichts wird ausgedruckt und tritt kein Fehler während der Kompilierung und Laufzeit. Warum passiert das? Warum verhindert strict nicht, dass dieser Code ausgeführt wird? Warum gibt es keinen Fehler zur Laufzeit, obwohl Dumper unbekannt ist?

Ich weiß, es erzeugt eine Warnung, wenn diese explizit aktiviert sind, aber ich bin interessiert, warum dieser Code in keiner Weise als "richtig" betrachtet wird.

+0

mögliche Duplikate von [Warum wird in diesem Perl-Beispiel der definierte Sdf-Wert zurückgegeben?] (Http://stackoverflow.com/questions/1646997/why-does-defined-sdf-return-true-in-this-perl -beispiel) –

Antwort

7

Einer der gültigen Syntaxen für print ist

print FILEHANDLE LIST 

In Ihrem Programm Perl Dumper als Dateihandle glob behandelt.

Ausführen dieses Code mit Warnungen aktiviert werden Ihnen sagen:

print() on unopened filehandle Dumper at ...

+0

Ok - das sehe ich jetzt. Kennen Sie den genauen Grund, warum Aktionen bei nicht geöffneten Dateihandles standardmäßig keine Fehler sind? – viraptor

+6

@viraptor: Weil du meine Bilderplatte nicht benutzt hast. Es ist, weil Unix nie sagt * "bitte", * und es sagt nie * "Es tut mir leid." * – tchrist

+8

@viraptor: sie sind * Fehler; print gibt false zurück und zeigt an, dass es fehlgeschlagen ist. Sie sind auch Warnungen, da sie einen wahrscheinlichen Codierungsfehler anzeigen. * Das Aktivieren von Warnungen ist wichtiger als die Verwendung von strict. * Sie sind * nicht * Ausnahmen (obwohl Sie Fehler in allen oder ausgewählten integrierten Einträgen als Ausnahmen mit 'autodie' propagieren können). – ysth

11

Wenn Sie mit dem Standard-Text begonnen hatte, dann würden Sie wissen:

#!/usr/bin/env perl 
# 
# name_of_program - what the program does as brief one-liner 
# 
# Your Name <[email protected]_host.TLA> 
# Date program written/released 
################################################################# 

use 5.10.0; 

use utf8; 
use strict; 
use autodie; 
use warnings FATAL => "all"; 

# ⚠ change to agree with your input: ↓ 
use open ":std" => IN => ":encoding(ISO-8859-1)", 
        OUT => ":utf8"; 
# ⚠ change for your output: ↑ — *maybe*, but leaving as UTF-8 is sometimes better 

END {close STDOUT} 

our $VERSION = 1.0; 

$| = 1; 

Die Antwort ist, dass Ihr Programm ist syntaktisch aber nicht semantisch korrekt. Sie drucken "something" zu dem ungeöffneten Dumper-Dateihandle-Objekt, da Dumper in dem Dativ-Steckplatz für den Methodenaufruf print ist. Das macht Dumperprint 's invocant. Aber Sie haben nie ein Handle mit diesem Namen geöffnet, also drucken Sie auf ein nicht initialisiertes Dateihandle.

Verwenden Sie meinen Textbaustein. BITTE!

+1

Was ist der Punkt des 'END' Blocks? – friedo

+2

@friedo: um sicherzustellen, dass es bei einem Fehler beim Öffnen und Schließen von stdout automatisch ausgeführt wird. Festplatte voll. E/A-Fehler. Solche Sachen. – tchrist

+0

AutoFlush ($ |) ist standardmäßig nicht empfehlenswert. Es macht manchmal Sinn, aber nicht immer, und sollte nicht in einer Textplatte gemacht werden.Zumindest sollte das Textbaustein einen Kommentar haben, der angibt, dass es optional ist. –