- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正尝试按如下方式比较两个 YAML 文件
忽略所有注释行
如果文件具有相同的模块,则比较这些模块的版本
如果版本不同,则将差异打印到文件 output.log
并引发错误
Modules:
python:
PATH: /cfg/python/version-1.0
c:
PATH: /cfg/c/release-1.2.0
c++:
PATH: /cfg/c++/release-1.1.5
java:
PATH: /cfg/java/version-2.157
#connect:
# PATH: /cfg/connect/release-1.2.3
Modules:
python:
PATH: /cfg/python/version-1.1
c:
PATH: /cfg/c/release-1.2.0
java:
PATH: /cfg/java/version-2.161
eclipse:
PATH: /cfg/eclipse/version-4.5
#connect:
# PATH: /cfg/connect/release-1.2.0
Error:
File1.yml - python: PATH: /cfg/python/verison-1.0
file2.yml - python: PATH: /cfg/python/verison-1.1
Error:
file1.yml - java: PATH: /cfg/java/version-2.157
file2.yml - java: PATH: /cfg/java/version-2.161
use strict;
use warnings;
open f1, "file1.yml" or die "couldn't open the file: $! \n ";
my @line1 = <f1>;
close(f1);
open f2, "file2.yml" or die "couldn't open the file: $! \n ";
my @line2 = <f2>;
close(f2);
open( OUT, ">", "error.txt" );
for ( my $i = 0; $i < @line1; $i++ ) {
for ( my $j = 0; $j < @line2; $j++ ) {
if ( $line1[$i] =~ $line2[$j] ) {
print OUT "Match Found: \n $line1[$i] \n $line2[$j]";
}
}
}
close OUT;
Match Found:
Modules:
Modules:
Match Found:
python:
python:
Match Found:
c:
c:
Match Found:
java:
java:
Match Found:
#connect:
#connect:
最佳答案
从技术上讲,您的程序并没有任何问题,因此我不会提供修复或解释。您编写的代码与您试图解决的代码不同。
相反,我将逐步向您展示一种不同的方法。首先,请记住 YAML 是一种数据结构描述。您可以将其读入 Perl 并将其转换为 Perl 理解的 native 数据结构,而不是使用文本比较。您的两个文件都具有相似的结构,这使得这非常简单。
读取数据结构并将其转换为不同的格式很困难。幸运的是,Perl 的众多优势之一是许多问题已经得到解决,并且可以在 CPAN 上使用。
use strict;
use warnings;
use YAML 'LoadFile';
my $file1 = LoadFile('file1.yml');
my $file2 = LoadFile('file2.yml');
此程序将读取您的文件并使用 LoadFile
from the YAML module 将内部的 YAML 数据结构转换为 Perl 哈希引用.
它本身当然不是很有用。那么让我们检查一下这些结构是什么样的。 Data::Dumper对此非常有用,它随您的 Perl 安装一起提供。 (我个人会使用 Data::Printer ,因为我认为输出更具可读性,但这取决于您)。
use Data::Dumper;
print Dumper $file1;
print Dumper $file2;
这将向我们展示:
$VAR1 = {
'Modules' => {
'java' => {
'PATH' => '/cfg/java/version-2.157'
},
'c' => {
'PATH' => '/cfg/c/release-1.2.0'
},
'c++' => {
'PATH' => '/cfg/c++/release-1.1.5'
},
'python' => {
'PATH' => '/cfg/python/verison-1.0'
}
}
};
$VAR1 = {
'Modules' => {
'c' => {
'PATH' => '/cfg/c/release-1.2.0'
},
'java' => {
'PATH' => '/cfg/java/version-2.161'
},
'python' => {
'PATH' => '/cfg/python/verison-1.1'
},
'eclipse' => {
'PATH' => '/cfg/eclipse/version-4.5'
}
}
};
请注意 key 的顺序与它们在文件中的顺序不同。那是因为 Perl 中的散列是无序的。这是一个特点。为了获得始终相同的输出,我们需要 sort
这些键稍后再说。
所以我们看到两个结构都有一个关键的模块。在内部,有另一个哈希引用,它以语言作为键,在每个哈希引用中,都有另一个哈希引用,只有一个 PATH 键和一个值。我们对每种语言的每个 PATH 的值(value)感兴趣。
为了获取语言,我们迭代了两个文件之一的模块 的键
。然后我们可以一直向下比较这些值。如果他们是 not equal , 我们打印错误信息。
use v5.10; # to get say
# get shortcuts so the lines are not as long
my $modules1 = $file1->{Modules};
my $modules2 = $file2->{Modules};
foreach my $language (sort keys %{ $file1->{Modules} }) {
if ($modules1->{$language}->{PATH} ne $modules2->{$language}->{PATH} ) {
say "Error:";
say "file1.yml - $language: PATH: $modules1->{$language}->{PATH}";
say "file2.yml - $language: PATH: $modules2->{$language}->{PATH}";
}
}
我正在使用 say
而不是 print
,它在末尾为我们附加了一个换行符。额外的变量 $modules1
和 $modules2
只是为了让代码更容易阅读,因为 $file1->{Modules}->{$language}->{PATH}
很长。
现在,如果我们运行我们的程序到此为止,我们将得到以下输出。
Error:
file1.yml - c++: PATH: /cfg/c++/release-1.1.5
file2.yml - c++: PATH:
Error:
file1.yml - java: PATH: /cfg/java/version-2.157
file2.yml - java: PATH: /cfg/java/version-2.161
Error:
file1.yml - python: PATH: /cfg/python/verison-1.0
file2.yml - python: PATH: /cfg/python/verison-1.1
Use of uninitialized value in string ne at /home/simbabque/code/scratch/scratch.pl line 133.
Use of uninitialized value in concatenation (.) or string at /home/simbabque/code/scratch/scratch.pl line 136.
这几乎就是我们想要的,但是有一些讨厌的警告(因为我们打开了使用警告
),而且 c++ 没有任何值(value)。我们需要过滤掉仅存在于两个文件之一中的语言。
只存在于 file2.yml 中的语言已经不被考虑,因为我们只查看 file1.yml 中的键。要从第一个文件中删除那些,我们必须检查它们是否 exist
在我们访问它们之前在另一个中。
next unless exists $modules2->{$language};
unless
keyword就像 if (not ...)
,我认为它更容易阅读,尤其是在这个非常简洁的 post-fix notation 中。 .现在程序给出了预期的输出。
Error:
file1.yml - java: PATH: /cfg/java/version-2.157
file2.yml - java: PATH: /cfg/java/version-2.161
Error:
file1.yml - python: PATH: /cfg/python/verison-1.0
file2.yml - python: PATH: /cfg/python/verison-1.1
这就是全部。不要忘记从代码中删除 Data::Dumper,因为它与生产程序无关。我们仅将其用作调试助手。
use strict;
use warnings;
use YAML 'LoadFile';
my $file1 = LoadFile('file1.yml');
my $file2 = LoadFile('file2.yml');
use v5.10;
# get shortcuts so the lines are not as long
my $modules1 = $file1->{Modules};
my $modules2 = $file2->{Modules};
foreach my $language (sort keys %{ $file1->{Modules} }) {
next unless exists $modules2->{$language};
if ($modules1->{$language}->{PATH} ne $modules2->{$language}->{PATH} ) {
say "Error:";
say "file1.yml - $language: PATH: $modules1->{$language}->{PATH}";
say "file2.yml - $language: PATH: $modules2->{$language}->{PATH}";
}
}
关于perl - 读取两个 YAML 文件并比较两者中出现的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841786/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!