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

时间:2019-01-09 01:21:21

标签: perl config

配置文件:

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的新手。

1 个答案:

答案 0 :(得分:2)

一个正则表达式中的错误旨在删除注释行:它需要一个锚点;按原样,它会在行中的任意位置找到第一个#,并在随后的所有内容中将其删除。

除此之外,我看不到您如何获得报告的输出。也许是程序中的其他内容,因为您的子(显然)从外部作用域中选取了一些%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: $0 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返回的项数,因此我删除了该项。

我使用Data::Dump打印数据。


正如mob所指出的那样,可以通过取消定义input record separator $/以及s/#.*//来删除第一个哈希值和所有其他值(以第一个换行符,因为.与换行符不匹配)。 这意味着$/在程序的其他位置未定义为全局变量(而不是local的范围内的定义),可能是错误的,需要修复;在该程序中使用此帖子中的功能仍然会失败。