- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Hash::Merge
perl 模块合并 2 个 yml 文件。并尝试使用 YMAL
模块中的 Dump
将其转储到 yml 文件。
use strict;
use warnings;
use Hash::Merge qw( merge );
Hash::Merge::set_behavior('RETAINMENT_PRECEDENT');
use File::Slurp qw(write_file);
use YAML;
my $yaml1 = $ARGV[0];
my $yaml2 = $ARGV[1];
my $yaml_output = $ARGV[2];
my $clkgrps = &YAML::LoadFile($yaml1);
my $clkgrps1 = &YAML::LoadFile($yaml2);
my $clockgroups = merge($clkgrps1, $clkgrps);
my $out_yaml = Dump $clockgroups;
write_file($yaml_output, { binmode => ':raw' }, $out_yaml);
合并 yml 文件后,我可以看到重复的条目,即两个 yml 文件中的以下内容相同。合并时,它将它们视为不同的条目。我们有什么隐式的方法来处理重复项吗?
最佳答案
从 YAML 文件中获取的数据结构通常包含键,值是 arrayrefs 和 hashrefs。在您的测试用例中,这是键 test
的 arrayref。
那么像Hash::Merge
这样的工具只能将hashrefs添加到属于同一key的arrayref;它并不是为了比较数组元素,因为没有通用标准。因此,您需要自己执行此操作以删除重复项,或将您选择的任何特定规则应用于数据。
处理这个问题的一种方法是序列化(因此字符串化)每个可能包含重复项的 arrayref 中的复杂数据结构,以便能够以它们作为键构建哈希,这是处理重复项的标准方法(使用 O( 1)复杂性,尽管可能有一个很大的常数)。
在 Perl 中序列化数据有多种方法。我推荐JSON::XS ,作为一个非常快速的工具,其输出可以被任何语言和工具使用。 (但是当然请研究其他人,这可能更适合您的具体需求。)
使用您的测试用例的简单完整示例
use strict;
use warnings;
use feature 'say';
use Data::Dump qw(dd pp);
use YAML;
use JSON::XS;
use Hash::Merge qw( merge );
#Hash::Merge::set_behavior('RETAINMENT_PRECEDENT'); # irrelevant here
die "Usage: $0 in-file1 in-file2 output-file\n" if @ARGV != 3;
my ($yaml1, $yaml2, $yaml_out) = @ARGV;
my $hr1 = YAML::LoadFile($yaml1);
my $hr2 = YAML::LoadFile($yaml2);
my $merged = merge($hr2, $hr1);
#say "merged: ", pp $merged;
for my $key (keys %$merged) {
# The same keys get overwritten
my %uniq = map { encode_json $_ => 1 } @{$merged->{$key}};
# Overwrite the arrayref with the one without dupes
$merged->{$key} = [ map { decode_json $_ } keys %uniq ];
}
dd $merged;
# Save the final structure...
更复杂的数据结构需要更明智的遍历;考虑使用工具来实现这一点。
使用打印问题中所示的文件
{ test => [ { directory => "LIB_DIR", name => "ObsSel.ktc", project => "TOT" }, { directory => "MODEL_DIR", name => "pipe.v", project => "TOT" }, { directory => "PCIE_LIB_DIR", name => "pciechip.ktc", project => "PCIE_MODE", }, { directory => "NAME_DIR", name => "fame.v", project => "SINGH" }, { directory => "TREE_PROJECT", name => "Syn.yml", project => "TOT" }, ],}
(我使用 Data::Dump 来显示复杂数据,因为它简单且默认紧凑输出。)
如果序列化和比较整个结构存在问题,请考虑使用某种摘要(校验和、散列)。
另一个选择是按原样比较数据结构,以便手动解决重复项。为了比较复杂的数据结构,我喜欢使用 Test::More
,它非常适合任何测试之外的单纯比较。当然,也有专用工具,例如 Data::Compare
。
最后,我们可以使用 Hash::Merge::add_behavior_spec 编写所需的行为,而不是像上面那样手动处理天真的合并
的结果。然后让模块完成这一切。有关如何使用此功能的具体示例,请参阅例如 this post和 this post和 this post .
请注意,在这种情况下,您仍然需要编写所有代码来完成上面的工作,但该模块确实使您摆脱了一些机制。
关于perl - 合并两个 yml 文件不处理重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67605179/
我已经成功创建了我的第一个 django 项目。 我的项目 foo 和 foobar 中有两个应用程序。 我在每个应用程序文件夹中创建了一个名为“fixtures”的文件夹。我没有在我的setting
我遵循了 cap + nginx + unicorn 上的文档,但在理解如何正确进行数据库部署时遇到了一些问题。 /config/database.yml 不应该在 git repo 中(最好) 在/
GitLab server can't start .原因很可能是 gitlab.yml 配置文件不正确。 用什么工具检查yml语法是否正确? 我试过 Notepad++ 和 SublimeText,
我们有一个站点范围的 config.yml 文件,它联系 api key 等... 我的另一个 YML 文件能否访问 config.yml 中的值? 配置文件: development: th
我正在尝试在我的第一个测试应用程序中设置用户和安全管理,但我已经有点迷失了,不知道什么是做什么的。 到目前为止我的设置:Symfony 2.5、SonataUserBundle(以及 FOSUserB
我需要在 application.yml 中使用 yaml anchor 引用和字符串连接对于 Spring Boot 应用程序。动机是重用现有配置而不是复制它们。例如,我们有以下 applicati
我需要将单个 YML 文件拆分为多个 YML 文件: 微服务.yml: #------------------------------------------------------------- #
在我的 Symfony2 config.yml 文件中,我想导入一些我希望收集在单独的 yml 文件中的配置。 我用过: imports: - { resource: parameters.yml }
我是新的 docker 用户。在不同的手册中,我通常发现 docker-compose.yml 文件用于描述 docker 作业,但在 docker 站点上为此目标使用了 docker-stack.y
我不明白这两种在 Symfony2 中设置全局常量的方法之间的区别。是否只能在 config.yml (+configuration.php) 中设置默认值和类型? 最佳答案 参数.yml 文件是所有
在 config.yml 中,我看到了 monolog、web_profiler 等根元素。那些服务可以在 service.yml 中配置吗?换句话说,我在 service.yml 中定义的服务是否可
我阅读了这个文档:https://serverless.com/framework/docs/providers/google/guide/services/ users/ serverless.
我正在从事 CI/CD 项目(使用 circleci 管道),目前,我坚持让我的“create_infrastructure”工作正常工作。下面是作业 # AWS infrastructure
编辑:原始标题“文本环境:”平台“sqlite”不支持函数“year”” 将 beberlei\DoctrineExtensions 合并到测试环境中会产生 Uncaught PHP Exceptio
abc.yml: d_lab: 192.168.1.1 d_location: /ephemeral ema: apple: 10.0.0.1 orange: 10.0.0.2
我的 springboot 应用程序有一些 yml 文件(每个文件用于各种配置文件 - dev、prod)来加载配置。我正在将配置移至数据库。 示例配置如下: admin: id: user05
我有一个大型剧本,它使用多个角色来设置新服务器。我想重新使用剧本,但为了退役阶段而不是调用 role_name/tasks/main.yml 并有很多 when: 语句,我想要告诉 Ansible 调
使用 bookdown 创作文档时,我知道有四个选项可以放置配置选项: _bookdown.yml _output.yml 第一个 .Rmd 的 yaml header 文档 传递给 bookdown
我们希望将我们的 azure pipeline build .ymls 模块化。对于完整的应用程序构建,将包括不同组件的构建 .yml 到主 .yml 中,将它们全部构建在一起。对于单独的组件,我们将
假设我的网站上有一个简单的传统联系表单,我希望它在发送电子邮件时在开发环境中使用主题“Test: (subject_field value)”,在生产环境中使用“(subject_field_valu
我是一名优秀的程序员,十分优秀!