The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use 5.012;
use strict;
use warnings;

use Ask qw(:all);
use XML::LibXML 2;

sub search_person {
	my ($xml, $search_string) = @_;
	
	my @results = $xml->findnodes(qq{//person[contains(name/text(), "$search_string")]});
	
	if (@results == 0) {
		error("Cannot find '$search_string'\n");
		die;
	}
	
	if (@results == 1) {
		return $results[0];
	}
	
	my $i = 0;
	my @choices = map { [$i++, $_->findvalue('name')] } @results;
	
	return $results[ single_choice("Multiple results", choices => \@choices) ];
}

my $xml     = XML::LibXML->load_xml(IO => \*DATA);
my $person  = search_person($xml, entry("Who are you looking for?"));
my $address = join q[; ], map { $_->textContent } $person->findnodes(qq{adr/*});

info($address, title => $person->findvalue('name'));

__DATA__
<contacts>
	<person>
		<name>Barack Obama</name>
		<adr>
			<street-address>1600 Pennsylvania Avenue Northwest</street-address>
			<locality>Washington</locality>
			<region>DC</region>
			<postal-code>20500</postal-code>
			<country>United States</country>
		</adr>
	</person>
	<person>
		<name>David Cameron</name>
		<adr>
			<street-address>10 Downing Street</street-address>
			<locality>London</locality>
			<postal-code>SW1A 2AA</postal-code>
			<country>United Kingdom</country>
		</adr>
	</person>
</contacts>