处理来自YAML文件的引用

时间:2016-07-04 06:37:05

标签: perl parsing yaml

我解析了一个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 个答案:

答案 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的代码,但是您应该使用与此相同的技术