Why doesn't my Perl blessed filehandle doesn't return true with `can('print')`'?

久未见 提交于 2019-12-05 08:48:01

Odd, it looks like you need to create a real IO::File object to get the can method to work. Try

use IO::File;

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

IO::Handle doesn't overload the open() function, so you're not actually getting an IO::Handle object in $fh. I don't know why the $fh->print("Hello, world") line works (probably because you're calling the print() function, and when you do things like $foo->function it's equivalent to function $foo, so you're essentially printing to the filehandle like you'd normally expect).

If you change your code to something like:

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";
}

...then your code will do as you expect. At least, it does for me!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!