有没有办法在$ fh上调用'print'时收到通知?

时间:2015-09-30 15:52:30

标签: perl filehandle

当我这样做时:

let url = NSURL(string: "https://website.com/api/loginauth?username=\(usernameField.text!)&password=\(passwordField.text!)")
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let request = NSURLRequest(URL: url!)

我需要调用一些print $fh 'text';

有办法吗?

3 个答案:

答案 0 :(得分:4)

您可以tie a filehandle自定义print对该文件句柄或该文件句柄上的任何其他操作的行为。

sub PrintNotifier::TIEHANDLE {
    my ($pkg, $orignalHandle) = @_;
    bless { glob => $orignalHandle }, $pkg;
}
sub PrintNotifier::PRINT {
    my ($self,@msg) = @_;
    ... do whatever you want with @msg here ...
    return print {$self->{glob}} @msg;
}
sub PrintNotifier::CLOSE { return close $_[0]->{glob} }

open my $fh, '>', 'some-file';
tie *$fh, 'PrintNotifier', $fh;
print $fh "something";           # calls  PrintNotifier::PRINT

答案 1 :(得分:2)

你可以tie手柄,正如暴民所建议的那样。或者,如果您可以更改代码并且Perl足够新,则可以替换

print $fh 'text';

$fh->print('text');

你可能会考虑更清晰的语法;然后你可以子类IO :: File:

package MyFH {
    use parent qw/ IO::File /;
    use mro; # Get next::method

    sub print {
        my ($self, @args) = @_;

        warn 'Printing ', @args;
        $self->next::method(@args);
    }
}

my $fh = MyFH->new();
$fh->open('file', '>') or die $!;

但是,

print $fh 'text';

式。

根据您的偏好,您可能会发现新的样式清理器,因为如果您的文件句柄是表达式,则允许

$obj->method()->print('text');

而不是

print {$obj->method()} 'text';

它对Perl 5.14及以上版本透明地工作,并且可以通过添加

使旧版Perls工作回到(至少)5.8
use IO::Handle;

到你想要使用它的文件的顶部(只是为了安全起见)。

答案 2 :(得分:0)

In未在perl中记录,但有用usage

如果您想在课堂上处理打印,您可以绑定

tie *$self, $self;
print $self 'text';
$self->print( 'text' );