为什么我的Perl祝福文件句柄不能用`can('print')`'返回true?

时间:2010-09-15 19:35:25

标签: perl file handle

出于某种原因,我无法使用Expect.pm的log_file方法处理文件句柄。我最初得到How can I pass a filehandle to Perl Expect's log_file function?的帮助,建议我使用IO :: Handle文件句柄传递给方法。这似乎是一个不同的问题,所以我想我会开始一个新的问题。

这是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
}

那么,我尝试了这个示例代码:

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

当我运行这个时,我得到两个(在我看来)冲突的项目。一行显示“Hello,world”和“No”输出的文件。在我看来,$fh->can行应该返回true。我错了吗?

2 个答案:

答案 0 :(得分:5)

奇怪的是,您似乎需要创建一个真正的IO::File对象才能使can方法起作用。尝试

use IO::File;

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

答案 1 :(得分:2)

IO::Handle不会使open()函数超载,因此您实际上并未在IO::Handle中获得$fh个对象。我不知道为什么$fh->print("Hello, world")行有效(可能是因为您正在调用print()函数,当您执行$foo->function之类的操作时,它等同于function $foo,所以你基本上就像你通常期望的那样打印到文件句柄。

如果您将代码更改为:

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

...然后您的代码将按预期执行。至少,它对我有用!