You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:43:43