2010-04-26 83 views
4

這裏是我想在Perl腳本做:如何從Perl中的XML文件中提取和保存值?

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

sub GetVariable() 
{ 
    ($FriendlyName) = @_; 
    switch($FriendlyName) 
    { 
     case "My Friendly Name" {print $data->{my_xml_tag_name}} 
     .... 
     .... 
     .... 
     } 
} 

是我使用的Perl只是因爲我從一個XML文件中讀取,但我需要一個shell腳本來獲得這些變量的問題。所以,這裏是我使用的是什麼:

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

這個工程完全按照預期,但我需要閱讀每一次我得到一個變量中的XML文件。有沒有一種方法可以跨越shell調用「保留」$data?這個想法是我只讀了一次XML文件。如果不是,是否有更簡單的方法可以做到這一點?這些都是事我不能改變:

  • 配置文件是一個XML
  • 需要的變量在shell腳本
+1

請注意,Switch.pm已棄用。 :) – 2010-04-26 18:56:52

回答

5

當我需要一些資料,由Perl的檢索,在一個shell腳本,我用Perl和集生成shell腳本通過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=$v\n"; 
} 

​​3210

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

真的很好!謝謝 – Freddy 2010-04-26 21:00:18

+0

這每次都讀取XML文件,這是我認爲你不想做的。 – 2010-04-26 21:07:59

+0

不,您只讀了一次XML,之後所有XML標記都只是shell變量,並且可以在shell腳本中使用,而無需再次調用readcfg。 – Freddy 2010-04-26 21:17:23

2

您可以分兩步做到這一點。如果你還沒有這樣做,你想創建一個存儲的Perl數據結構,並且當你有時,你存儲的版本,所以你不必再解析它。

有五月的方式來做到這一點,但這裏是一個使用Storable版本:

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腳本一個shell腳本的,有你的Perl腳本調用你的shell腳本:

# 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' 
+0

謝謝,我測試過,它取得了訣竅。然而,在讀取每個變量時,它將從存儲的文件中讀取。但是,謝謝,我不知道你可以在Perl中做到這一點。 – Freddy 2010-04-26 21:01:50

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 $FriendlyName\n" 
     } # 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可以採購很多次

+0

謝謝,它絕對會工作。然而,提出了一種更優雅的方式,它基本上在shell側使用eval而不是加載文件來做同樣的事情。 – Freddy 2010-04-26 21:02:55

相關問題