Используйте запросы XPath для извлечения интересующих вас значений. Эти три запроса XPath должны возвращать искомые значения:
//BOOK-REF/@ID
//BOOK-REF/AUTHOR-REF/SURNAME
//BOOK-REF/YEAR-REF
Для выполнения запросов XPath используйте что-то вроде XML:: LibXML .Полный пример:
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml(string => q{<?xml version="1.0" encoding="utf-8"?>
<BOOK-REF ID="Kyle-ch001-bib036"><AUTHOR-REF><SURNAME>Neinstein</SURNAME>, <GIVEN-NAME>L. S.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Gordon</SURNAME>, <GIVEN-NAME>C. G.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Katzman</SURNAME>, <GIVEN-NAME>D.</GIVEN-NAME></AUTHOR-REF>, <AUTHOR-REF><SURNAME>Rosen</SURNAME>, <GIVEN-NAME>D.</GIVEN-NAME></AUTHOR-REF>, & <AUTHOR-REF><SURNAME>Woods</SURNAME>, <GIVEN-NAME>E.</GIVEN-NAME></AUTHOR-REF> (<YEAR-REF>2007</YEAR-REF>). <BOOK-TITLE-REF>Adolescent health care: A practical guide</BOOK-TITLE-REF> (<EDITION-REF>5th ed.</EDITION-REF>). <PLACE-OF-PUBLICATION-REF>Philadelphia</PLACE-OF-PUBLICATION-REF>: <PUBLISHER-REF>Lippincott Williams and Wilkins</PUBLISHER-REF>.</BOOK-REF>
});
my $xc = XML::LibXML::XPathContext->new($xml);
my $id = $xc->find('//BOOK-REF/@ID');
my @snames = map $_->textContent => $xc->findnodes('//BOOK-REF/AUTHOR-REF/SURNAME');
my $year = $xc->find('//BOOK-REF/YEAR-REF');
print "$id\n";
print join(', ' => @snames), "\n";
print "$year\n";
# prints:
# Kyle-ch001-bib036
# Neinstein, Gordon, Katzman, Rosen, Woods
# 2007
Вы можете красиво сохранить результаты в массиве, например так:
push @some_array, +{
id => $id,
snames => \@snames,
year => $year
};
Если вы хотите следовать своей исходной схеме и дублировать идентификатор и год для каждого имени, тогда это:
push @arr2, map [ $id, $_, $year ] => @snames;
Другой потенциально полезный способ их хранения - использование хеш-кода над полем id, поэтому
$some_hash{$id} = +{
id => $id,
snames => \@snames,
year => $year
};