2010-09-15 11 views
5

Aus irgendeinem Grund kann ich keine Dateihandles mit Expect.pm log_file Methode arbeiten. Ich bekam ursprünglich Hilfe auf How can I pass a filehandle to Perl Expect's log_file function?, wo vorgeschlagen wurde, dass ich ein IO :: Handle-Dateihandle an die Methode übergeben. Das scheint ein anderes Thema zu sein, also dachte ich, ich würde eine neue Frage beginnen.Warum gibt mein perl gesegnetes Dateihandle nicht mit `can ('print')` 'zurück?

Dies ist der säumige Abschnitt Expect.pm:

if (ref($file) ne 'CODE') { 
    croak "Given logfile doesn't have a 'print' method" 
    if not $fh->can("print"); 
    $fh->autoflush(1);  # so logfile is up to date 
} 

Also dann, ich diesen Beispielcode versucht:

use IO::Handle; 
open $fh, ">>", "file.out" or die "Can't open file"; 
$fh->print("Hello, world"); 
if ($fh->can("print")) 
{ 
    print "Yes\n"; 
} 
else 
{ 
    print "No\n"; 
} 

Als ich das laufen, bekomme ich zwei (meiner Meinung nach) widersprüchliche Punkte. Eine Datei mit einer einzelnen Zeile, die "Hello, world" und die Ausgabe von "No" enthält. Meiner Meinung nach sollte die Zeile $fh->can True zurückgeben. Liege ich hier falsch?

+2

'verwenden Sie streng; Verwenden Sie Warnungen; ' – Ether

+0

Ich habe keine Antwort darüber, warum dies seltsam wirkt, aber ich vermute, ein Teil davon kommt von IO :: Handle nicht eine normale Klasse. Ein Teil davon ist in der Perl-Quelle, anstatt wie ein normales Modul zu leben. Es könnte einen Fehlerbericht verdienen (benutze perlbug) :) –

Antwort

5

Odd, es sieht aus wie Sie müssen ein echtes IO::File Objekt erstellen, um die can Methode zu arbeiten. Versuchen Sie

use IO::File; 

my $fh = IO::File->new("file.out", ">>") 
    or die "Couldn't open file: $!"; 
+0

Verwendete IO :: Datei. Nochmals vielen Dank für Ihre Hilfe. –

2

IO::Handle Überlastung nicht die open() Funktion, so dass Sie nicht wirklich ein IO::Handle Objekt in $fh bekommen. Ich weiß nicht, warum die $fh->print("Hello, world") Zeile funktioniert (wahrscheinlich, weil Sie die print()-Funktion aufrufen, und wenn Sie Dinge wie $foo->function tun, entspricht es function $foo, so dass Sie im Wesentlichen auf das Dateihandle drucken, wie Sie normalerweise erwarten würden).

Wenn Sie Ihren Code, um etwas ändern wie:

use strict; 
use IO::Handle; 
open my $fh, ">>", "file.out" or die "Can't open file"; 
my $iofh = new IO::Handle; 
$iofh->fdopen($fh, "w"); 
$iofh->print("Hello, world"); 
if ($iofh->can("print")) 
{ 
    print "Yes\n"; 
} 
else 
{ 
    print "No\n"; 
} 

... dann wird Ihr Code tun, wie Sie es erwarten. Zumindest für mich!

+0

Warum benutzt du 'open' +' fdopen' statt nur 'IO :: File'? – cjm

+0

Weil ich nichts über 'IO :: File' wusste, bis ich Chas 'Antwort sah. Ich hatte 'IO :: Handle' im Gehirn, weil ich dachte, dass das OP es benutzen wollte. – CanSpice

+0

Ich wusste auch nichts über IO :: File, bis ich gerade nachgesehen habe. Nochmals vielen Dank für Ihre Hilfe! Immer eine Lernerfahrung. –

Verwandte Themen