/ /どうすればPerlのXMLファイルから値を抽出して保存できますか? -xml、perl、shell

PerlでXMLファイルから値を抽出して保存するにはどうすればよいですか? - xml、perl、shell

Perlスクリプトで私がやろうとしていることは次のとおりです。

$ data = ""; サブloadXMLConfig() { $ filename = "somexml.xml" $ data = $ xml-> XMLin($ filename); }  サブGetVariable() { ($ FriendlyName)= @_; switch($ FriendlyName) { case "My Friendly Name" {print $ data-> {my_xml_tag_name}} .... .... .... } }

問題は、XMLファイルから読み取っているというだけの理由でPerlを使用していることですが、シェルスクリプトによってこれらの変数を取得する必要があります。だから、ここに私が使用しているものがあります:

$ perl -e "require "scrpt.pl"; loadConfigFile(); GetVariable("My Variable")"

これは期待どおりに機能しますが、変数を取得するたびにXMLファイルを読み取る必要があります。 「保存」できる方法はありますか $data シェル呼び出し間で?アイデアは、XMLファイルを一度だけ読むことです。いいえの場合、これを行うことができるより簡単な方法はありますか?これらは私が変更できないものです。

  • 構成ファイルはXMLです
  • シェルスクリプトで変数が必要

回答:

回答№1は5

シェルスクリプトでPerlによって取得された情報が必要な場合、Perlでシェルスクリプトを生成し、環境変数を設定します eval

myscript

#!/bin/bash
BINDIR=`dirname $0`
CONFIG=$BINDIR/config.xml
eval `$BINDIR/readcfg $CONFIG`
echo Running on the $planet near the $star.

readcfg

#!/usr/bin/perl
use XML::Simple;
my $xml = XMLin("config.xml", VarAttr => "name", ContentKey => "-content");
while (my ($k, $v) = each %{$xml->{param}}) {
$v =~ s/"/"""""/g;
$v = ""$v"";
print "export $k=$vn";
}

config.xml

<config>
<param name="star">Sun</param>
<param name="planet">Earth</param>
</config>

回答№2については2

これは2つの手順で実行できます。保存済みのPerlデータ構造をまだ作成していない場合は作成し、使用している場合は保存済みバージョンを作成して、再度解析する必要がないようにします。

これを実現する方法はいくつかありますが、ここでは「 収納可能

 use Storable qw(nstore retrieve);

my $stored_data_structure = "some_file_name";

my $data = do {
# from the stored data structure if it is there
if( -e $stored_data_structure ) {
retrieve( $stored_data_structure );
}
# otherwise parse the xml and store it
else {
my $data = $xml->XMLin( $xml_filename );
nstore( $data, $stored_data_structure );
$data;
}
};

コンセプトを逆にすることも検討してください。 Perlスクリプトを呼び出すシェルスクリプトの代わりに、Perlスクリプトがシェルスクリプトを呼び出すようにします。

 # load the data, as before

# set some environment variables
$ENV{SomeThing} = $data->{SomeThing};

# now that the environment is set up
# turn into the shell script
exec "/bin/bash", "script_name"

回答№3の場合は1

シェル実行可能ファイルに値を保存するだけです。 bourne shell(sh)スクリプトと、興味のある変数名のリストを事前に知っていると仮定します。

$data="";
sub loadXMLConfig()
{
$filename="somexml.xml"
$data = $xml->XMLin($filename);
}

sub GetVariable()
{
($FriendlyName) = @_;
switch($FriendlyName)
{
case "My Friendly Name" {
print "$FriendlyName="$data->{my_xml_tag_name}"; export $FriendlyNamen"
} # Use "export var=value" form for bash
....
....
....
}
}

sub storeVariables {
# @variables list defined elsewhere - this is just a sketch
foreach my $variable (@variables) {
GetVariable($variable);
}
}

そして、次のように呼び出します。

$ perl -e "require "scrpt.pl"; loadConfigFile(); storeVariables();" > my_vars.sh
$ source my_vars.sh

そして、my_vars.shは何回もソースできます