【问题标题】:How can I use callbacks with Perl's Text::Document?如何在 Perl 的 Text::Document 中使用回调?
【发布时间】:2011-05-22 08:03:13
【问题描述】:
#!/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 );

有人可以给我看一个合理且易于理解的回调函数示例吗?

#!/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 ().

【问题讨论】:

    标签: perl text callback document


    【解决方案1】:

    EnumerateV函数内部,为集合中的每个文档调用回调函数,并且收集并返回每个回调函数调用的返回值。使用map 函数可能有一种非常简单且等效的方法来编写它。

    无论如何,这里有一个示例数据的回调函数示例:

    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";
    

    输出:

    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:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2013-08-23
      • 1970-01-01
      • 2012-07-04
      相关资源
      最近更新 更多