📄 handle.pm
字号:
package Tie::Handle;use 5.005_64;our $VERSION = '4.0';=head1 NAMETie::Handle, Tie::StdHandle - base class definitions for tied handles=head1 SYNOPSIS package NewHandle; require Tie::Handle; @ISA = (Tie::Handle); sub READ { ... } # Provide a needed method sub TIEHANDLE { ... } # Overrides inherited method package main; tie *FH, 'NewHandle';=head1 DESCRIPTIONThis module provides some skeletal methods for handle-tying classes. SeeL<perltie> for a list of the functions required in tying a handle to a package.The basic B<Tie::Handle> package provides a C<new> method, as well as methodsC<TIEHANDLE>, C<PRINT>, C<PRINTF> and C<GETC>. For developers wishing to write their own tied-handle classes, the methodsare summarized below. The L<perltie> section not only documents these, buthas sample code as well:=over=item TIEHANDLE classname, LISTThe method invoked by the command C<tie *glob, classname>. Associates a newglob instance with the specified class. C<LIST> would represent additionalarguments (along the lines of L<AnyDBM_File> and compatriots) needed tocomplete the association.=item WRITE this, scalar, length, offsetWrite I<length> bytes of data from I<scalar> starting at I<offset>.=item PRINT this, LISTPrint the values in I<LIST>=item PRINTF this, format, LISTPrint the values in I<LIST> using I<format>=item READ this, scalar, length, offsetRead I<length> bytes of data into I<scalar> starting at I<offset>.=item READLINE thisRead a single line=item GETC thisGet a single character=item CLOSE thisClose the handle=item OPEN this, filename(Re-)open the handle=item BINMODE thisSpecify content is binary=item EOF thisTest for end of file.=item TELL thisReturn position in the file.=item SEEK this, offset, whencePosition the file.Test for end of file.=item DESTROY thisFree the storage associated with the tied handle referenced by I<this>.This is rarely needed, as Perl manages its memory quite well. But theoption exists, should a class wish to perform specific actions upon thedestruction of an instance.=back=head1 MORE INFORMATIONThe L<perltie> section contains an example of tying handles.=head1 COMPATIBILITYThis version of Tie::Handle is neither related to nor compatible withthe Tie::Handle (3.0) module available on CPAN. It was due to anaccident that two modules with the same name appeared. The namespaceclash has been cleared in favor of this module that comes with theperl core in September 2000 and accordingly the version number hasbeen bumped up to 4.0.=cutuse Carp;use warnings::register;sub new { my $pkg = shift; $pkg->TIEHANDLE(@_);}# "Grandfather" the new, a la Tie::Hashsub TIEHANDLE { my $pkg = shift; if (defined &{"{$pkg}::new"}) { warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"); $pkg->new(@_); } else { croak "$pkg doesn't define a TIEHANDLE method"; }}sub PRINT { my $self = shift; if($self->can('WRITE') != \&WRITE) { my $buf = join(defined $, ? $, : "",@_); $buf .= $\ if defined $\; $self->WRITE($buf,length($buf),0); } else { croak ref($self)," doesn't define a PRINT method"; }}sub PRINTF { my $self = shift; if($self->can('WRITE') != \&WRITE) { my $buf = sprintf(shift,@_); $self->WRITE($buf,length($buf),0); } else { croak ref($self)," doesn't define a PRINTF method"; }}sub READLINE { my $pkg = ref $_[0]; croak "$pkg doesn't define a READLINE method";}sub GETC { my $self = shift; if($self->can('READ') != \&READ) { my $buf; $self->READ($buf,1); return $buf; } else { croak ref($self)," doesn't define a GETC method"; }}sub READ { my $pkg = ref $_[0]; croak "$pkg doesn't define a READ method";}sub WRITE { my $pkg = ref $_[0]; croak "$pkg doesn't define a WRITE method";}sub CLOSE { my $pkg = ref $_[0]; croak "$pkg doesn't define a CLOSE method";}package Tie::StdHandle; our @ISA = 'Tie::Handle';use Carp;sub TIEHANDLE { my $class = shift; my $fh = do { \local *HANDLE}; bless $fh,$class; $fh->OPEN(@_) if (@_); return $fh;}sub EOF { eof($_[0]) }sub TELL { tell($_[0]) }sub FILENO { fileno($_[0]) }sub SEEK { seek($_[0],$_[1],$_[2]) }sub CLOSE { close($_[0]) }sub BINMODE { binmode($_[0]) }sub OPEN{ $_[0]->CLOSE if defined($_[0]->FILENO); @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]);}sub READ { read($_[0],$_[1],$_[2]) }sub READLINE { my $fh = $_[0]; <$fh> }sub GETC { getc($_[0]) }sub WRITE{ my $fh = $_[0]; print $fh substr($_[1],0,$_[2])}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -