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 (множественное число), если вы могли бы иметь несколько совпадений.

Использование

( $tree->findvalues('//p') )[0] ;

вместо.

Другие вопросы по тегам