HTML::TreeBuilder::XPath findvalue возвращает конкатенацию значений
findvalue
Функция в HTML::TreeBuilder::XPath возвращает объединение любых значений, найденных xpath
запрос.
Почему это происходит, и как объединение значений может быть полезным для всех?
2 ответа
Почему это делает это?
Когда вы звоните findvalue
вы запрашиваете одно скалярное значение. Если есть несколько совпадений, они должны быть каким-то образом объединены в одно значение.
Из документации по https://metacpan.org/pod/HTML::TreeBuilder::XPath:
findvalue ($ path)
... Если путь возвращает NodeSet,
$nodeset->xpath_to_literal
вызывается автоматически для вас (и, следовательно, возвращается Tree::XPathEngine::Literal).
И из документации для https://metacpan.org/pod/Tree::XPathEngine::NodeSet:
xpath_to_literal ()
Возвращает объединение всех строковых значений всех узлов в списке.
Альтернативой может быть возвращение объекта Tree:: XPathEngine:: NodeSet, чтобы пользователь мог сам перебирать результаты, но findvalues
Метод уже возвращает список.
Как объединение значений может быть полезным для всех?
Например:
use strict;
use warnings 'all';
use 5.010;
use HTML::TreeBuilder::XPath;
my $content = do { local $/; <DATA> };
my $tree = HTML::TreeBuilder::XPath->new_from_content($content);
say $tree->findvalue('//p');
__DATA__
<p>HTML is just text.</p>
<p>It can still make sense without the markup.</p>
Выход:
HTML is just text.It can still make sense without the markup.
Однако, как правило, имеет смысл получить список совпадений и выполнить итерацию по ним, а не выполнять тупую конкатенацию, поэтому следует использовать findvalues
(множественное число), если вы могли бы иметь несколько совпадений.