Perl多哈希字符串值差异检测:配置文件参数对比输出需求
搞定Perl配置输出的可读性问题!
嘿,我来帮你把脚本的输出变得更清晰易读,同时搞定STDOUT和CSV的输出需求。咱们分几步来实现:
第一步:把混乱的配置字符串转成结构化哈希
首先,$hoh{文件名}{conf}里的空格分隔字符串太不友好了,先把它解析成键值对哈希,这样后续处理起来灵活得多:
use strict; use warnings; use Text::ParseWords; # 处理可能带引号/空格的参数值 use Text::CSV; # 轻松生成规范CSV # 遍历所有配置文件 foreach my $filename (keys %hoh) { my %params; # 把配置字符串拆成键值对,quotewords能处理带引号的参数(比如val = "hello world") my @pairs = quotewords('\s+', 0, $hoh{$filename}{conf}); foreach my $pair (@pairs) { # 只分割第一个=,避免值里包含=的情况 my ($key, $value) = split /=/, $pair, 2; $params{$key} = $value if defined $key && defined $value; }
第二步:给STDOUT做个漂亮的输出
现在可以把文件名和参数用清晰的格式打印出来,让终端看起来舒服:
# 用加粗强调文件名,分隔线区分不同配置 print "=== *配置文件: $filename* ===\n"; # 参数按排序对齐,看起来更整齐 foreach my $key (sort keys %params) { # 左对齐键名,留够宽度,参数值紧跟后面 printf " %-25s = %s\n", $key, $params{$key}; } print "\n"; # 每个配置文件之间留空分隔
第三步:输出到CSV文件
CSV要结构化,方便后续分析或者用Excel打开。这里推荐两种格式,你按需选:
# 初始化CSV对象(注意:这段代码应该放在循环外面,避免重复创建) my $csv = Text::CSV->new({ binary => 1, auto_diag => 1, eol => "\n" }); open my $fh, '>>', 'config_test_results.csv' or die "打不开CSV文件: $!"; # 格式1:每行一条参数,包含文件名(适合参数不固定的情况) # 先写表头(只写一次,放在循环外) # $csv->print($fh, ['配置文件名', '参数名', '参数值']); foreach my $key (sort keys %params) { $csv->print($fh, [$filename, $key, $params{$key}]); } # 格式2:每行一个配置文件,所有参数作为列(适合所有配置参数固定的情况) # my @all_param_keys = sort keys %params; # $csv->print($fh, [$filename, @params{@all_param_keys}]); close $fh; }
额外小技巧
- 如果想让终端输出更炫酷,可以用
Term::ANSIColor模块给文件名加颜色,比如print colored("=== 配置文件: $filename ===\n", 'bold blue');,记得先通过CPAN安装这个模块。 - 如果你的配置里没有带空格或引号的参数,也可以不用
Text::ParseWords,直接用split /\s+/拆分字符串,但前者更稳妥。
这样处理后,终端输出清晰直观,CSV文件也规范好用,完美满足你的需求!
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

