1

我现在还不能完全理解 TIE,但是到目前为止我看到的示例( example-1 example-2 example-3 )使用的是非 Moosy 实现,无论如何可以这样做:

package MY_STDOUT;
use strict;
my $c = 0;
my $malformed_header = 0;
open(TRUE_STDOUT, '>', '/dev/stdout');
tie *STDOUT, __PACKAGE__, (*STDOUT);

sub TIEHANDLE {
    my $class = shift;
    my $handles = [@_];
    bless $handles, $class;
    return $handles;
}

sub PRINT {
    my $class = shift;
    if (!$c++ && @_[0] !~ /^content-type/) {
        my (undef, $file, $line) = caller;
        print STDERR "Missing content-type in $file at line $line!!\n";
        $malformed_header = 1;
    }
    return 0 if ($malformed_header);
    return print TRUE_STDOUT @_;
}
1;


use MY_STDOUT;
print "content-type: text/html\n\n"; #try commenting out this line
print "<html>\n";
print "</html>\n";

以更 Perl-Moosy 的方式?

例如我应该做

open(TRUE_STDOUT, '>', '/dev/stdout');
tie *STDOUT, __PACKAGE__, (*STDOUT);

在 BUILD{} 函数中?

将其实现为 Moosy 类或 Moose::Role 是否更有意义?

最后,我是否必须做类似的事情

my $MY_STDOUT = MY_STDOUT->new();

使用它?

4

1 回答 1

0

我已经想出了如何使用 IO::Scalar

https://gist.github.com/1250048

现在我只需要弄清楚如何为 STDOUT 做到这一点!

于 2011-09-29T06:04:40.620 回答