Я написал программу, используя Perl XML::LibXML.
Он создает XML::LibXML с помощью load_xml().
Я был удивлен, что для этого не требуется вызов new().
Когда необходим вызов new()?
Вот код, который на удивление (для меня) работает:
#!/usr/bin/env perl
use 5.020;
use warnings;
use XML::LibXML;
#the input xml
my $inputstr = <<XML;
<a>
<b class = "type1">some type 1 data</b>
<b class = "type2">some type 2 data</b>
<b class = "type3">some type 3 data</b>
<b class = "type4">some type 4 data</b>
<b notaclass = "type1">don't change this</b>
<c class = "type1">don't change this either</c>
</a>
XML
my $dom = XML::LibXML->load_xml(
string => $inputstr
);
say $dom->toString();
XML::LibXML
использует стиль, в котором методы работают как методы объекта и класса. Это для удобства. Если вы вызовете XML::LibXML->load_xml, он создаст для вас объект синтаксического анализатора, настроит его, используя ваши аргументы, загрузит XML, а затем выкинет объект синтаксического анализатора.
sub load_xml {
my $class_or_self = shift;
my %args = map { ref($_) eq 'HASH' ? (%$_) : $_ } @_;
my $URI = delete($args{URI});
$URI = "$URI" if defined $URI; # stringify in case it is an URI object
my $parser;
# if called as an object method
if (ref($class_or_self)) {
$parser = $class_or_self->_clone();
$parser->{XML_LIBXML_PARSER_OPTIONS} = $parser->_parser_options(\%args);
# if called as a class method
} else {
$parser = $class_or_self->new(\%args);
}
Это означает, что эти два фрагмента кода эквивалентны.
my $dom = XML::LibXML->load_xml(
string => $inputstr
);
my $dom = XML::LibXML->new(
string => $inputstr
)->load_xml(
string => $inputstr
);
Когда необходим вызов new()?
Если вы хотите изменить параметры синтаксического анализатора по умолчанию и повторно использовать объект синтаксического анализатора. Или когда вы хотите использовать метод, который доступен только как метод объекта.
Например, вы можете захотеть передать настроенный анализатор XML в другую функцию или использовать его для настройки поведения другого объекта.
my $parser = XML::LibXML->new(pedantic_parser => 1);
my $object = Some::Class->new(xml_parser => $parser);
# This will use $parser which has been configured to be pedantic.
$object->do_something_with_an_xml_document($document);