Aktualisieren des XML-Attributwerts basierend auf einem anderen mit Perl

Dies ist meine XML-Beispieldatei

<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>

In diesem Fall muss ich den Revisionswert nur dann aktualisieren, wenn<path> enthält den String "opensource".

Ich habe viel gesucht, konnte aber nichts Nützliches finden, um dies zu erreichen. Ich könnte den Wert basierend auf der Position wie folgt ändern. Kann mir jemand helfen, dies zu aktualisieren? Oder lassen Sie mich wissen, ob es dafür eine bessere Perl-Bibliothek gibt.

#!/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,
);

Antworten auf die Frage(2)

Ihre Antwort auf die Frage