我有一个看起来像这样的XML文件,我希望检索RAM的值。我对perl很新。任何帮助将不胜感激。
<hardware>
<computer OS="Linux" ENV="DEV">2GB</computer>
<computer OS="windows" ENV="QA">3GB</computer>
</hardware>
它更像是一个检索值的查询.eg:&#34; perl myscript.pl Linux DEV&#34;应该给我&#34; 2GB&#34;作为输出。
答案 0 :(得分:1)
使用XML::LibXML
:
use strict;
use warnings;
use feature qw(say);
use XML::LibXML;
die "Usage: $0 <OS> <ENV>\n" if @ARGV != 2;
my ($os, $env) = @ARGV;
my $xml = XML::LibXML->load_xml(IO => \*DATA);
say $xml->findvalue(qq{//computer[\@OS = "$os"][\@ENV = "$env"]})
__DATA__
<hardware>
<computer OS="Linux" ENV="DEV">2GB</computer>
<computer OS="windows" ENV="QA">3GB</computer>
</hardware>
或使用XML::Twig
:
use strict;
use warnings;
use feature qw(say);
use XML::Twig;
die "Usage: $0 <OS> <ENV>\n" if @ARGV != 2;
my ($os, $env) = @ARGV;
my $t = XML::Twig->new(
twig_handlers => {
qq{//computer[\@OS="$os" and \@ENV="$env"]} => sub { say $_->text() },
},
);
$t->parse( do {local $/; <DATA>} );
__DATA__
<hardware>
<computer OS="Linux" ENV="DEV">2GB</computer>
<computer OS="windows" ENV="QA">3GB</computer>
</hardware>
输出:
$ perl script.pl Linux DEV
2GB
答案 1 :(得分:0)
如果您只需要获取XML标记内的值,请使用简单的正则表达式匹配:
foreach (split(/\n/,$xmltext))
{
print "$1\n" if /<computer.*>(.*)<\/computer>/;
}
如果要处理整个XML结构(就像您应该那样),请使用XML模块,如XML :: Parser
MOD:
对于类似查询的搜索,您必须使用XML解析器,例如:
#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Bare;
my $parser = new XML::Bare( file => "ram.xml" );
print $_->{value}."\n" foreach (@{$parser->find_by_perl($parser->parse()->{hardware}->{computer}, "(-OS eq '$ARGV[0]') && (-ENV eq '$ARGV[1]')")});
这将列出符合您条件的所有值