Внутри функции 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: