⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 call.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
字号:
# Call.pm## Copyright (c) 1995-2001 Paul Marquess. All rights reserved.## This program is free software; you can redistribute it and/or# modify it under the same terms as Perl itself. package Filter::Util::Call ;require 5.002 ;require DynaLoader;require Exporter;use Carp ;use strict;use warnings;use vars qw($VERSION @ISA @EXPORT) ;@ISA = qw(Exporter DynaLoader);@EXPORT = qw( filter_add filter_del filter_read filter_read_exact) ;$VERSION = "1.07" ;sub filter_read_exact($){    my ($size)   = @_ ;    my ($left)   = $size ;    my ($status) ;    croak ("filter_read_exact: size parameter must be > 0")	unless $size > 0 ;    # try to read a block which is exactly $size bytes long    while ($left and ($status = filter_read($left)) > 0) {        $left = $size - length $_ ;    }    # EOF with pending data is a special case    return 1 if $status == 0 and length $_ ;    return $status ;}sub filter_add($){    my($obj) = @_ ;    # Did we get a code reference?    my $coderef = (ref $obj eq 'CODE') ;    # If the parameter isn't already a reference, make it one.    $obj = \$obj unless ref $obj ;    $obj = bless ($obj, (caller)[0]) unless $coderef ;    # finish off the installation of the filter in C.    Filter::Util::Call::real_import($obj, (caller)[0], $coderef) ;}bootstrap Filter::Util::Call ;1;__END__=head1 NAMEFilter::Util::Call - Perl Source Filter Utility Module=head1 SYNOPSIS    use Filter::Util::Call ;=head1 DESCRIPTIONThis module provides you with the framework to write I<Source Filters>in Perl. An alternate interface to Filter::Util::Call is now available. SeeL<Filter::Simple> for more details.A I<Perl Source Filter> is implemented as a Perl module. The structureof the module can take one of two broadly similar formats. Todistinguish between them, the first will be referred to as I<methodfilter> and the second as I<closure filter>.Here is a skeleton for the I<method filter>:    package MyFilter ;    use Filter::Util::Call ;    sub import    {        my($type, @arguments) = @_ ;        filter_add([]) ;    }    sub filter    {        my($self) = @_ ;        my($status) ;        $status = filter_read() ;        $status ;    }    1 ;and this is the equivalent skeleton for the I<closure filter>:    package MyFilter ;    use Filter::Util::Call ;    sub import    {        my($type, @arguments) = @_ ;        filter_add(            sub             {                my($status) ;                $status = filter_read() ;                $status ;            } )    }    1 ;To make use of either of the two filter modules above, place the linebelow in a Perl source file.    use MyFilter; In fact, the skeleton modules shown above are fully functional I<SourceFilters>, albeit fairly useless ones. All they does is filter thesource stream without modifying it at all.As you can see both modules have a broadly similar structure. They bothmake use of the C<Filter::Util::Call> module and both have an C<import>method. The difference between them is that the I<method filter>requires a I<filter> method, whereas the I<closure filter> gets theequivalent of a I<filter> method with the anonymous sub passed toI<filter_add>.To make proper use of the I<closure filter> shown above you need tohave a good understanding of the concept of a I<closure>. SeeL<perlref> for more details on the mechanics of I<closures>.=head2 B<use Filter::Util::Call>The following functions are exported by C<Filter::Util::Call>:    filter_add()    filter_read()    filter_read_exact()    filter_del()=head2 B<import()>The C<import> method is used to create an instance of the filter. It iscalled indirectly by Perl when it encounters the C<use MyFilter> linein a source file (See L<perlfunc/import> for more details onC<import>).It will always have at least one parameter automatically passed by Perl- this corresponds to the name of the package. In the example above itwill be C<"MyFilter">.Apart from the first parameter, import can accept an optional list ofparameters. These can be used to pass parameters to the filter. Forexample:    use MyFilter qw(a b c) ;will result in the C<@_> array having the following values:    @_ [0] => "MyFilter"    @_ [1] => "a"    @_ [2] => "b"    @_ [3] => "c"Before terminating, the C<import> function must explicitly install thefilter by calling C<filter_add>.B<filter_add()>The function, C<filter_add>, actually installs the filter. It takes oneparameter which should be a reference. The kind of reference used willdictate which of the two filter types will be used.If a CODE reference is used then a I<closure filter> will be assumed.If a CODE reference is not used, a I<method filter> will be assumed.In a I<method filter>, the reference can be used to store contextinformation. The reference will be I<blessed> into the package byC<filter_add>.See the filters at the end of this documents for examples of usingcontext information using both I<method filters> and I<closurefilters>.=head2 B<filter() and anonymous sub>Both the C<filter> method used with a I<method filter> and theanonymous sub used with a I<closure filter> is where the mainprocessing for the filter is done.The big difference between the two types of filter is that the I<methodfilter> uses the object passed to the method to store any context data,whereas the I<closure filter> uses the lexical variables that aremaintained by the closure.Note that the single parameter passed to the I<method filter>,C<$self>, is the same reference that was passed to C<filter_add>blessed into the filter's package. See the example filters later on fordetails of using C<$self>.Here is a list of the common features of the anonymous sub and theC<filter()> method.=over 5=item B<$_>Although C<$_> doesn't actually appear explicitly in the sample filtersabove, it is implicitly used in a number of places.Firstly, when either C<filter> or the anonymous sub are called, a localcopy of C<$_> will automatically be created. It will always contain theempty string at this point.Next, both C<filter_read> and C<filter_read_exact> will append anysource data that is read to the end of C<$_>.Finally, when C<filter> or the anonymous sub are finished processing,they are expected to return the filtered source using C<$_>.This implicit use of C<$_> greatly simplifies the filter.=item B<$status>The status value that is returned by the user's C<filter> method oranonymous sub and the C<filter_read> and C<read_exact> functions takethe same set of values, namely:    < 0  Error    = 0  EOF    > 0  OK=item B<filter_read> and B<filter_read_exact>These functions are used by the filter to obtain either a line or blockfrom the next filter in the chain or the actual source file if therearen't any other filters.The function C<filter_read> takes two forms:    $status = filter_read() ;    $status = filter_read($size) ;The first form is used to request a I<line>, the second requests aI<block>.In line mode, C<filter_read> will append the next source line to theend of the C<$_> scalar.In block mode, C<filter_read> will append a block of data which is <=C<$size> to the end of the C<$_> scalar. It is important to emphasisethe that C<filter_read> will not necessarily read a block which isI<precisely> C<$size> bytes.If you need to be able to read a block which has an exact size, you canuse the function C<filter_read_exact>. It works identically toC<filter_read> in block mode, except it will try to read a block whichis exactly C<$size> bytes in length. The only circumstances when itwill not return a block which is C<$size> bytes long is on EOF orerror.It is I<very> important to check the value of C<$status> after I<every>call to C<filter_read> or C<filter_read_exact>.=item B<filter_del>The function, C<filter_del>, is used to disable the current filter. Itdoes not affect the running of the filter. All it does is tell Perl notto call filter any more.See L<Example 4: Using filter_del> for details.=back=head1 EXAMPLESHere are a few examples which illustrate the key concepts - as suchmost of them are of little practical use.The C<examples> sub-directory has copies of all these filtersimplemented both as I<method filters> and as I<closure filters>.=head2 Example 1: A simple filter.Below is a I<method filter> which is hard-wired to replace alloccurrences of the string C<"Joe"> to C<"Jim">. Not particularlyUseful, but it is the first example and I wanted to keep it simple.    package Joe2Jim ;    use Filter::Util::Call ;    sub import    {        my($type) = @_ ;        filter_add(bless []) ;    }    sub filter    {        my($self) = @_ ;        my($status) ;        s/Joe/Jim/g            if ($status = filter_read()) > 0 ;        $status ;    }    1 ;Here is an example of using the filter:    use Joe2Jim ;    print "Where is Joe?\n" ;And this is what the script above will print:    Where is Jim?=head2 Example 2: Using the contextThe previous example was not particularly useful. To make it moregeneral purpose we will make use of the context data and allow anyarbitrary I<from> and I<to> strings to be used. This time we will use aI<closure filter>. To reflect its enhanced role, the filter is calledC<Subst>.    package Subst ;    use Filter::Util::Call ;    use Carp ;    sub import    {        croak("usage: use Subst qw(from to)")            unless @_ == 3 ;        my ($self, $from, $to) = @_ ;        filter_add(            sub             {                my ($status) ;                s/$from/$to/                    if ($status = filter_read()) > 0 ;                $status ;            })    }    1 ;and is used like this:    use Subst qw(Joe Jim) ;    print "Where is Joe?\n" ;=head2 Example 3: Using the context within the filterHere is a filter which a variation of the C<Joe2Jim> filter. As well assubstituting all occurrences of C<"Joe"> to C<"Jim"> it keeps a countof the number of substitutions made in the context object.Once EOF is detected (C<$status> is zero) the filter will insert anextra line into the source stream. When this extra line is executed itwill print a count of the number of substitutions actually made.Note that C<$status> is set to C<1> in this case.    package Count ;    use Filter::Util::Call ;    sub filter    {        my ($self) = @_ ;        my ($status) ;        if (($status = filter_read()) > 0 ) {            s/Joe/Jim/g ;	    ++ $$self ;        }	elsif ($$self >= 0) { # EOF            $_ = "print q[Made ${$self} substitutions\n]" ;            $status = 1 ;	    $$self = -1 ;        }        $status ;    }    sub import    {        my ($self) = @_ ;        my ($count) = 0 ;        filter_add(\$count) ;    }    1 ;Here is a script which uses it:    use Count ;    print "Hello Joe\n" ;    print "Where is Joe\n" ;Outputs:    Hello Jim    Where is Jim    Made 2 substitutions=head2 Example 4: Using filter_delAnother variation on a theme. This time we will modify the C<Subst>filter to allow a starting and stopping pattern to be specified as wellas the I<from> and I<to> patterns. If you know the I<vi> editor, it isthe equivalent of this command:    :/start/,/stop/s/from/to/When used as a filter we want to invoke it like this:    use NewSubst qw(start stop from to) ;Here is the module.    package NewSubst ;    use Filter::Util::Call ;    use Carp ;    sub import    {        my ($self, $start, $stop, $from, $to) = @_ ;        my ($found) = 0 ;        croak("usage: use Subst qw(start stop from to)")            unless @_ == 5 ;        filter_add(             sub             {                my ($status) ;                if (($status = filter_read()) > 0) {                    $found = 1                        if $found == 0 and /$start/ ;                    if ($found) {                        s/$from/$to/ ;                        filter_del() if /$stop/ ;                    }                }                $status ;            } )    }    1 ;=head1 Filter::SimpleIf you intend using the Filter::Call functionality, I would stronglyrecommend that you check out Damian Conway's excellent Filter::Simplemodule. Damian's module provides a much cleaner interface thanFilter::Util::Call. Although it doesn't allow the fine control thatFilter::Util::Call does, it should be adequate for the majority ofapplications. It's available at   http://www.cpan.org/modules/by-author/Damian_Conway/Filter-Simple.tar.gz   http://www.csse.monash.edu.au/~damian/CPAN/Filter-Simple.tar.gz=head1 AUTHORPaul Marquess =head1 DATE26th January 1996=cut

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -