将文件句柄传递给Perl中的对象方法

时间:2013-10-20 20:53:11

标签: perl filehandle

我想将一个打开的文件句柄传递给一个方法,以便该方法可以写入该文件。

但文件句柄似乎在对象内部关闭。

# open the file
open(MYOUTFILE, ">$dir_1/stories.txt") or die "Can't open file stories.txt"; #open for write, overwrite
print MYOUTFILE "outside"; #works

my $story = ObjectStory->new();
$story->appendToFile(\*MYOUTFILE);
close(MYOUTFILE);

对象,应该写入文件:

package ObjectStory;

# constructor
sub ObjectStory::new {
  my ($class) = @_;
  %hash = ();
  bless \%hash, $class;
}

# addToFile method
sub ObjectStory::appendToFile {
  my ($class, $MYOUTFILE) = @_;

  # check if open
  if (tell($MYOUTFILE) != -1) {
    print $MYOUTFILE
        "\n File Handle is not open!";    # File handle is always closed...
  }
  print $MYOUTFILE "test";
}

# the 1 is necessary, because other scripts will require this Module.
# require MyModule  results in true, only if there is a 1 at the end of the module
1;

1 个答案:

答案 0 :(得分:5)

仅当出现错误时,tell运算符才会返回-1。没有理由期望您显示的代码出现错误情况,并且它当然不是检测文件句柄是否打开的方法。

来自IO::Handleopened方法会执行您想要的操作,因此您可以编写

unless ($filehandle->opened) { ... }

但请注意,您的原始代码会尝试编写有关文件句柄的消息未对已关闭的文件句柄打开,因此它永远不会起作用!

除非您运行的是Perl 5的版本14或更高版本,否则您需要将use IO::Handle添加到模块中,该版本已更改为已加载IO::File(以及IO::Handle)的按需

另请注意,不需要使用包名称为所有子例程名称添加前缀。这就是package语句的用途 - 更改默认命名空间,以便您不必这样做。

以代码的这种修改为例

package ObjectStory;

sub new {
  my ($class) = @_;
  my %hash;
  bless \%hash, $class;
}

sub appendToFile {
  my ($self, $fh) = @_;
  die 'File Handle is not open!' unless $fh->opened;
  print $fh "test\n";
}

1;