我分析如下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_01
和runid_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
)的變量。當我打印這兩個變量,我得到陣列(因爲我用[]
。我希望他們爲數組,但我想知道如何對其進行解析。
[Crossposted(http://www.perlmonks.org/?node_id=1167060)。 – choroba
嗨,我只發佈在perlmonks,無法獲得解決方案,我已經在這裏試過,請幫助 – hanish
你誤解***解析***的意義。 'YAML :: XS'模塊正在做所有的解析,並返回一個Perl數據結構,它等同於你開始使用的YAML數據。這意味着你的所有庫函數名稱都是錯誤的,因爲它們不解析任何東西。你也絕不能*在Perl子程序中使用原型。你的代碼是正確的,沒有'($)';並且在調用Perl子例程時不應使用&符號&。無論你從緊急需求更新中得到這個想法,因爲自從Perl v5.0在22年前發佈以來,它並不是最佳實踐 – Borodin