How can I use callbacks with Perl's Text::Document?

余生颓废 提交于 2019-12-11 07:42:32

问题


#!/usr/local/bin/perl
use warnings;
use 5.012;
use Text::Document;
use Text::DocumentCollection;

my $c = Text::DocumentCollection->new( file => 'coll.db'  );

my $doc_one = Text::Document->new( lowercase => 0, compressed => 0 );
my $doc_two = Text::Document->new( lowercase => 0, compressed => 0 );
my $doc_three = Text::Document->new( lowercase => 0, compressed => 0 );

$doc_one->AddContent( 'foo bar biz buu muu muu' );
$doc_two->AddContent( 'foo foofoo Foo foo' );
$doc_three->AddContent( 'one two three foo foo' );

$c->Add( 'key_one', $doc_one );
$c->Add( 'key_two', $doc_two );
$c->Add( 'key_three', $doc_three );

Could someone show me a sensible and understandable Callback-function-example?

#!/usr/local/bin/perl
use warnings;
use 5.012;
use Text::Document;
use Text::DocumentCollection;

my $c = Text::DocumentCollection->NewFromDB( file => 'coll.db' );

my @result = $c->EnumerateV( \&Callback, 'the rock' );
say "@result";

sub Callback {
    ...
    ...
}

# The function Callback will be called on each element of the collection as:
#  my @l = CallBack( $c, $key, $doc, $rock );
# where $rock is the second argument to Callback.
# Since $c is the first argument, the callback may be an instance method of Text::DocumentCollection.
# The final result is obtained by concatenating all the partial results (@l in the example above). 
# If you do not want a result, simply return the empty list ().

回答1:


Inside the EnumerateV function, the callback function gets called for every document in the collection, and the return values of each callback function call are collected and returned. There's probably a pretty simple and equivalent way to write this using the map function.

In any case, here's an example callback function for your sample data:

sub document_has_twice {
    # return document key if term appears twice in the document
    my ($collection_object, $key, $document, $search_term) = @_;
    if ($document->{terms}{$search_term}
            && $document->{terms}{$search_term} >= 2) {
        return $key;
    }
    return;
}

my @r = $c->EnumerateV( \&document_has_twice, "foo");
print "These documents contain the word 'foo' at least twice: @r\n";

@r = $c->EnumerateV( \&document_has_twice, "muu");
print "These documents contain the word 'muu' at least twice: @r\n";

@r = $c->EnumerateV( \&document_has_twice, "stackoverflow");
print "These documents contain the word 'stackoverflow' at least twice: @r\n";

Output:

These documents contain the word 'foo' at least twice: key_three key_two
These documents contain the word 'muu' at least twice: key_one
These documents contain the word 'stackoverflow' at least twice:


来源:https://stackoverflow.com/questions/4389605/how-can-i-use-callbacks-with-perls-textdocument

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!