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 中的函数仍然会失败。
配置文件:
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 中的函数仍然会失败。