2010-12-08 2 views
1
#!/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); 

誰かがわかりやすく理解できるコールバック関数の例を表示できますか? EnumerateV関数の内部PerlのText :: Documentでコールバックを使用するにはどうすればいいですか?

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

答えて

2

、コールバック関数は、コレクション内のすべての文書のために呼び出され、各コールバック関数呼び出しの戻り値が収集され、返されます。 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: 
関連する問題