2016-07-04 56 views
-2

我分析如下YAML文件:處理引用文件

test_control: 
standalone_execution: yes 
code_checkout: no #yes/no 

rules_file: 
- rules_file_id: &rulesid_01 
    name:   
    hostname: 
    path: /local/home/hanmaghu 
- rules_file_id: &rulesid_02 
    name:   
    hostname: NA 
    path: NA 

run_target_platforms: 
- run_target_id: &runid_01 
    target_controls: 
    run_target_type: simulator #simulator, emulator , hardware 
    run_target_active: yes 
    target_connection_info: 
    run_target_hostname: 
    run_target_ipaddr: unknown 

standalone_execution: 
utpsm_executable: 
    hostname: 
    hostip: NA 
    name: tpsm  
rulesfile: [*rulesid_01] 
target_list: [*runid_01] 
...   

你觀察最後兩行是指向引用rulesid_01runid_01陣列。我已經採取了大部分的變量(解析後),但現在我不知道該怎麼走的參考變量

這裏是我的Perl代碼部分:

#!/usr/bin/perl 

use strict; 
use warnings; 

use YAML_Lib; 
use YAML::XS; 

my $input_file; 
my $yaml_input; 

if (scalar(@ARGV) < 1) { 
    print("USAGE:: $0 <Input file>\n"); 
    exit(0); 
} 

$input_file = $ARGV[0]; 
print "Input File = $input_file\n"; 

# parse the yaml file 
$yaml_input = YAML::XS::LoadFile("$input_file"); 
&YAML_Lib::parse_yaml($yaml_input); 

這個庫我寫(功能)parse_yaml如下:

#!/usr/bin/perl 
package YAML_Lib; 

use YAML::XS; 
use Exporter 'import'; 

# function declarations 

sub parse_yaml_testcontrol($); 
sub parse_yaml_run_tgt($); 
sub parse_yaml_standalone($); 
sub parse_yaml_rulesfile($); 

########## Start parsing YAML stream ########## 

sub parse_yaml($) { 
    my ($yaml_input) = @_; 

    print "in parse yaml \n"; 

    parse_yaml_testcontrol($yaml_input); 
    parse_yaml_run_tgt($yaml_input); 
    parse_yaml_standalone($yaml_input); 
    parse_yaml_rulesfile($yaml_input); 
} 

#test-control 
sub parse_yaml_testcontrol($) { 
    my ($yaml_input) = @_; 

    $test_control   = $yaml_input->{test_control}; 
    $standalone_execution = $test_control->{standalone_execution}; 
    $code_checkout  = $test_control->{code_checkout}; 
} 

#standalone execution 
sub parse_yaml_standalone($) { 
    my ($yaml_input) = @_; 

    $standalone_exec = $yaml_input->{standalone_execution}; 
    $utpsm_exec  = $standalone_exec->{utpsm_executable}; 
    $se_hostname  = $utpsm_exec->{hostname}; 
    $se_tgt_list  = $standalone_exec->{target_list}; 
    $se_rulesfile = $standalone_exec->{rulesfile}; 

    print "$se_tgt_list->$run_target_controls[0]->$run_target_types[0]\n"; 

    #print "\n $se_tgt_list, $se_name , $se_hostname, $se_username ,$se_password, $se_path ,$se_rulesfile \n"; 
} 

我在分享一些代碼的一部分。我認爲並非所有的領域都有意義。

我想知道我應該如何解析引用($se_tgt_list$se_rulesfile)的變量。當我打印這兩個變量,我得到陣列(因爲我用[]。我希望他們爲數組,但我想知道如何對其進行解析。

+1

[Crossposted(http://www.perlmonks.org/?node_id=1167060)。 – choroba

+0

嗨,我只發佈在perlmonks,無法獲得解決方案,我已經在這裏試過,請幫助 – hanish

+0

你誤解***解析***的意義。 'YAML :: XS'模塊正在做所有的解析,並返回一個Perl數據結構,它等同於你開始使用的YAML數據。這意味着你的所有庫函數名稱都是錯誤的,因爲它們不解析任何東西。你也絕不能*在Perl子程序中使用原型。你的代碼是正確的,沒有'($)';並且在調用Perl子例程時不應使用&符號&。無論你從緊急需求更新中得到這個想法,因爲自從Perl v5.0在22年前發佈以來,它並不是最佳實踐 – Borodin

回答

1

正如我所說的在我的評論,你誤會什麼解析是,你的庫函數只是瀏覽一個由YAML::XS生成的Perl數據結構,它完成了對你的YAML數據的所有必要的解析。你真的不需要這個庫,因爲它所做的只是複製一些元素嵌套的Perl數據結構

你的問題很不清楚,我不明白「我不知道如何取參考變量」「我希望他們爲數組,但我想知道如何對其進行解析」但我懷疑的問題是,你在你的YAML在此塊創建單個元素組成的數組

rulesfile: [*rulesid_01] 
target_list: [*runid_01] 

所以

$standalone_exec = $yaml_input->{standalone_execution}; 

$utpsm_exec  = $standalone_exec->{utpsm_executable}; 
$se_hostname  = $utpsm_exec->{hostname}; 

$se_tgt_list  = $standalone_exec->{target_list}; 
$se_rulesfile = $standalone_exec->{rulesfile}; 

$se_tgt_list$se_rulesfile是一個元素的數組

正如您使用參考散列訪問哈希元素與$href->{$key},您使用引用到一個數組訪問的ARRA引用與$aref->[$i]

因爲在YAML引用的Y元素,$yaml_input->{standalone_execution}{target_list}[0]是相同的哈希的引用作爲$yaml_input->{run_target_platforms}[0]{run_target_id},你可以在完全相同的方式

你不顯示您的代碼parse_yaml_rulesfile處理它,但你那裏做,你應該使用相同的技術

+0

是的,也許我沒有用正確的詞彙,實際上我有更多的元素在數組中,現在我只顯示它一個。我的觀點是從模塊解析後,perl中的數據結構必須根據yaml文件中的引用來解析。爲此我使用了上述方法。 – hanish