配置文件:
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的新手。
答案 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
的范围内的定义),可能是错误的,需要修复;在该程序中使用此帖子中的功能仍然会失败。