Perl 正确读取逗号分隔值的配置值

Perl to read the config value properly for comma separated values

配置文件:

rb_acc=country of account opening #,Global #,country_account_open
rb_adv=adverse media information #,Global #,adverse_info_flag,adverse_info_severity,adverse_info_date
rb_arm=account relationship manager #,Global #,arm_code,count_of_clients

我的阅读习惯:

sub read_header{    
    open my $header_file, '<', $header_configuration_path or die "Can not open '$header_file': $OS_ERROR"; 
    while (<$header_file>) {        
        chomp;                 
        s/#.*//;               
        s/^\s+//;               
        #s/\s+$//;              
        next unless length;    
        my ($var, $val) = split(/\s*=\s*/, $_, 2);
        $data{$var} = $val;
    }
    close $header_file;

    print "Data values\n";
    print Dumper \%data;

}

我的输出如下:

$VAR1 = {
          'rb_acc' => 'country of account opening
rb_adv=adverse media information #,Global #,adverse_info_flag,adverse_info_severity,adverse_info_date
rb_arm=account relationship manager #,Global #,arm_code,count_of_clients'

        };

但我需要类似的东西

rb_acc=>country of account opening #,Global #,country_account_open
rb_adv=>adverse media information #,Global #,adverse_info_flag,adverse_info_severity,adverse_info_date
rb_arm=>account relationship manager #,Global #,arm_code,count_of_clients

请帮忙。

我使用的拆分不起作用我想我是 perl 的新手。

一个错误是在正则表达式中用于删除注释行:它需要一个锚点;就目前而言,它会在该行的任何位置找到第一个 # 并将其与随后的所有内容一起删除。

除此之外,我看不出您是如何获得报告的输出的。也许这是程序中的其他内容,因为您的子程序(显然)从外部范围获取了一些 %data?只是这种可能性就足以提醒您始终在最小范围内声明您的变量。

程序,还有一些其他的修复(和一些个人喜好)

use warnings;
use strict;
use feature 'say';

use Data::Dump qw(dd);

sub read_header {
    my ($file) = @_; 

    my %data;
    open my $fh, '<', $file or die "Can't open $file: $!";
    while (<$fh>) {
        chomp;    
        s/^\s*#.*//;    
        s/^\s+//;            #/
        next if not length;    
        my ($var, $val) = split /\s*=\s*/; 
        $data{$var} = $val;
    }   
    close $fh;
    return \%data;
}

my $file = shift || die "Usage: [=10=] config-file\n";

my $data = read_header($file);

dd $data;

打印

{
  rb_acc => "country of account opening #,Global #,country_account_open",
  rb_adv => "adverse media information #,Global #,adverse_info_flag,adverse_info_severity,adverse_info_date",
  rb_arm => "account relationship manager #,Global #,arm_code,count_of_clients",
}

所需的变量 -- $file%data -- 已声明并传递(在函数中和函数外),正如您应该始终做的那样。 因为在这种情况下,不需要将 split 的项数限制为 return 我删除了它。

我用Data::Dump打印数据


〉如 mob 所述,可以通过取消定义 input record separator $/ 以及删除第一个散列的 s/#.*// 来生成输出和所有其他(到第一个换行符,因为 . 不匹配换行符)。 这意味着 $/ 在程序的其他地方未定义为全局(而不是 local-ized 到该范围),这可能是错误的,需要修复;在该程序中使用此 post 中的函数仍然会失败。