Atualizando o valor do atributo xml com base em outro com Perl

Este é o meu arquivo xml de amostra

<manifest>
 <default>
    <remote>remote1</remote>
    <revision>rev1</revision>
 </default>
 <project>
    <name>common</name>
    <path>opensource/device</path>
    <revision>sa</revision>
    <x-ship>oss</x-ship>
 </project>
 <project>
   <name>external</name>
   <path>source/tp</path>
   <x-ship>none</x-ship>
 </project>
 <project>
   <name>ws</name>
   <path>opensource/ws</path>
   <remote>nj</remote>
   <revision>myno</revision>
   <x-ship>none</x-ship>
 </project>
</manifest>

Neste preciso atualizar o valor da revisão somente quando<path> possui uma string "opensource".

Eu pesquisei bastante, mas não encontrei nada útil para conseguir isso. Poderia modificar o valor com base na posição abaixo. Alguém pode me ajudar a atualizar isso? Ou deixe-me saber se existe uma biblioteca Perl melhor para fazer isso.

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;

my $xml_file = 'dev.xml';

my $xml = XMLin(
    $xml_file,
    KeepRoot => 1,
    ForceArray => 1,
);

$xml->{manifest}->[0]->{project}->[2]->{revision} = 'kyo';

XMLout(
    $xml,
    KeepRoot => 1,
    NoAttr => 1,
    OutputFile => $xml_file,
);

questionAnswers(2)

yourAnswerToTheQuestion