gpt4 book ai didi

perl - 读取 YAML 文件后如何使用数据?

转载 作者:行者123 更新时间:2023-12-04 22:50:14 24 4
gpt4 key购买 nike

我正在从 YAML 文件中读取数据(使用 YAML qw/LoadFile/)。我需要能够读取这些值并将它们插入到其他文件中。

YAML 文件采用以下格式:

--- 
host:
- name: first_host
interface:
- name: eth0
oldip: 1.2.3.4
newip: 2.3.4.5
oldgw: 1.2.3.1
newgw: 2.3.4.1
- name: eth1
oldip: 1.2.3.4
newip: 2.3.4.5
oldgw: 1.2.3.1
newgw: 2.3.4.1
- name: eth2
oldip: 1.2.3.4
newip: 2.3.4.5
oldgw: 1.2.3.1
newgw: 2.3.4.1

如果我通过 Data::Dumper 运行它,我会得到以下信息(启用了 $Data::Dumper::Terse):
{
'host' => [
{
'interface' => [
{
'oldgw' => '1.2.3.1',
'newgw' => '2.3.4.1',
'name' => 'eth0',
'newip' => '2.3.4.5',
'oldip' => '1.2.3.4'
},
{
'oldgw' => '1.2.3.1',
'newgw' => '2.3.4.1',
'name' => 'eth1',
'newip' => '2.3.4.5',
'oldip' => '1.2.3.4'
},
{
'oldgw' => '1.2.3.1',
'newgw' => '2.3.4.1',
'name' => 'eth2',
'newip' => '2.3.4.5',
'oldip' => '1.2.3.4'
}
],
'name' => 'first_host'
},
]
}

我需要进行更改,例如在/etc/sysconfig/network-scripts/ifcfg-eth0 中,将 oldip 值与 newip 值交换。但是,我不知道如何使用它。如果我只是打印加载的 YAML 文件的值,它似乎只是一个哈希引用。但是,如果我尝试取消引用散列,我会得到以下信息:
Reference found where even-sized list expected

后面是散列引用。

这是我开始的脚本:
#!/usr/bin/perl

use strict;
use warnings;
use YAML qw(LoadFile);
use Data::Dumper;
$Data::Dumper::Terse = 1;

my %data = LoadFile("/home/user/bin/perl/dummy_data.yml");

print \%data

有人可以向我解释我需要做什么才能从此输入中读取值,以便我可以进行需要进行的更改吗?

最佳答案

LoadFile正在返回一个 hashref,而不是一个哈希。 The difference is subtle but important.

您可以选择按原样使用 hashref:

my $data = LoadFile("data.yml");
print $data;

或者您可以将其转换为哈希:
my %data = %{ LoadFile("data.yml") };
print %data;

您可以随意处理引用,只要您知道它是什么。

您访问元素的方式略有不同:
$data{'foo'}   #hash %data
$data->{'foo'} #hashref $data

您可能会注意到 subs 倾向于期望散列引用而不是散列,有时。这通常是人们第一次遇到它们的方式。

关于perl - 读取 YAML 文件后如何使用数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18413452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com