我解析了一个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
)。当我打印这两个变量时,我得到数组(因为我使用了[]
。我希望它们作为数组,但我想知道如何解析它们。
答案 0 :(得分: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}
的哈希元素一样,您使用对数组的引用来访问具有$aref->[$i]
的数组元素
由于YAML中的引用,$yaml_input->{standalone_execution}{target_list}[0]
是对$yaml_input->{run_target_platforms}[0]{run_target_id}
相同哈希的引用,您可以用完全相同的方式处理它
您没有显示parse_yaml_rulesfile
的代码,但是您应该使用与此相同的技术