【问题标题】:How can I store and access a filehandle in a Perl class?如何在 Perl 类中存储和访问文件句柄?
【发布时间】:2010-06-12 05:28:53
【问题描述】:

请先看下面的代码。

#! /usr/bin/perl
package foo;

sub new {

    my $pkg = shift;
    my $self = {};
    my $self->{_fd} = undef;
    bless $self, $pkg;

    return $self;
}

sub Setfd {

    my $self = shift;
    my $fd = shift;
    $self_->{_fd} = $fd;
}

sub write {

    my $self = shift;
    print $self->{_fd} "hello word";
}

my $foo = new foo;

我的目的是使用哈希将文件句柄存储在一个类中。文件句柄一开始是未定义的,但可以通过调用 Setfd 函数来初始化。然后 可以调用write将字符串“hello word”实际写入文件句柄指示的文件中,假设文件句柄是“write”打开成功的结果。

但是,perl 编译器只是抱怨“打印”行中有语法错误。你们中的任何人都可以告诉我这里有什么问题吗?提前致谢。

【问题讨论】:

  • 一些旁注,使用这些命名样式中的任何一种以更好地显示单词分隔:setFdset_fdSetFd。保持一致的大小写风格,writeset_fdWriteSet_Fd(我建议使用前者)。同样在 Perl 中,它是“文件句柄”而不是“文件描述符”,因此您需要 set_fh。最后,打开警告(use warnings 或在#! 行中添加-w)它会显示构造函数中的错误。
  • 另外,use strict,因为它会在这行代码$self_->{_fd} = $fd; 中显示这个非语法但可能不是你的意思的错误
  • @Schwern:感谢您的建议。

标签: perl filehandle


【解决方案1】:

您需要将$self->{_fd} 表达式放在一个块中或将其分配给一个更简单的表达式:

    print { $self->{_fd} } "hello word";

    my $fd = $self->{_fd};
    print $fd "hello word";

来自perldoc -f print

请注意,如果您将 FILEHANDLE 存储在数组中,或者如果您使用任何其他比标量变量更复杂的表达式来检索它,则必须使用返回文件句柄值的块来代替:

print { $files[$i] } "stuff\n";
print { $OK ? STDOUT : STDERR } "stuff\n";

【讨论】:

    【解决方案2】:

    交替:

    use IO::Handle;
    
    # ... later ...
    
    $self->{_fd}->print('hello world');
    

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多