Хотя в шаблонном решении нет ничего неправильного , я хочу показать, что не обязательно сложно делать это «правильным» способом XML-слинга, может сэкономить вам много времени позже, если ваши требования когда-либо изменятся.
Тем не менее, вот эскиз того, как вы могли бы построить это с помощью XML :: Twig. Любые углы, которые я вырезал, строго соответствуют названию хорошего примера фрагмента, который помещается на одном экране:)
use strict;
use warnings;
use XML::Twig;
sub gen_id {
my @chars = ('A'..'Z', '0'..'9');
join '', @chars[ map { rand @chars } 1 .. 8 ];
}
sub gen_vehicle {
my $vehicle = XML::Twig::Elt->new('vehicle');
while (my ($key, $value) = splice @_, 0, 2) {
XML::Twig::Elt->new($key => $value)
->paste(last_child => $vehicle);
}
$vehicle;
}
sub gen_vehicles {
my $vehicles = XML::Twig::Elt->new('vehicles');
$vehicles->set_att( ID => gen_id() );
gen_vehicle(make => 'Toyota', model => 'Yaris', year => 2009)
->paste(last_child => $vehicles);
gen_vehicle(make => 'Ford', model => 'Taurus', year => 2008)
->paste(last_child => $vehicles);
$vehicles;
}
XML::Twig->set_pretty_print('indented');
gen_vehicles()->print;