此问题的最终帖子:根据您的最新更新,我相信以下代码说明了/:/
使用split
. 它还指出,当使用函数参数而不是依赖全局变量时,更容易阅读代码:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
for my $varname ( qw( adntopr.cpr.smtref.actv cpr_operator_detail )) {
print $varname, "\n";
print Dumper get_columns(\*DATA, $varname);
}
sub get_columns {
my ($input_fh, $varname) = @_;
while ( my $line = <$input_fh> ) {
chomp $line;
my @values = split /=>/, $line;
next unless $varname eq $values[0];
return [ split /:/, $values[1] ];
}
return;
}
__DATA__
adntopr.cpr.smtref.actv=>3:8:18:29:34:38:46:51:53:149
adntopr.smtsale2=>3:8:16:22:27:37:39:47:52:57:62:82:102:120:138:234:239:244:249:250:259:262:277:282:287:289:304:319:327:331:335:339:340:341:342:353:364:375:386:397:408
cpr_operator_detail=>3:11:18:28:124:220:228:324
cpr_operator_org_unit_map=>7:12
cpr_operator_metric_actual=>8:15:25:33:38:40:51
C:\Temp> tjm
adntopr.cpr.smtref.actv
$VAR1 = [
'3',
'8',
'18',
'29',
'34',
'38',
'46',
'51',
'53',
'149'
];
cpr_operator_detail
$VAR1 = [
'3',
'11',
'18',
'28',
'124',
'220',
'228',
'324'
];
该代码中有很多内容。这是我对您尝试做的事情的解释:
更新:鉴于您最近对模式中的正则表达式特殊字符的评论,如果您打算在模式中使用它们进行拆分,请务必引用它们。也有$ETLSpliter::name
可能包含其他特殊字符。我修改了代码来处理这种可能性。
sub getColumns {
open my $input, '<', $ETLSpliter::configFile
or die "Error opening '$ETLSpliter::configFile': $!");
my @columns;
while( my $conline = <$input> ) {
my @values = split /=>/, $conline;
print "not at: ".$conline;
push @columns, $values[1] if $values[0] =~ /\Q$ETLSpliter::name/;
}
return @columns;
}
另一个更新:
因此,该模式确实/=>/
基于您在下面的评论。然后:
my $conline = q{cpr_operator_detail=>3:11:18:28:124:220:228:324};
my @values = split /=>/, $conline;
use Data::Dumper;
print Dumper \@values;
__END__
C:\Temp> tml
$VAR1 = [
'cpr_operator_detail',
'3:11:18:28:124:220:228:324'
];
没有错误...没有警告因此,还有其他事情正在发生,您坚持不向我们展示。
其他备注:
使用词法文件句柄,让 perl 告诉你它可能遇到的错误,而不是假设。
在最小的适用范围内声明变量。
当您可以在语句中执行此操作时,无需在循环主体中分配$_
to 。$conline
while
在原始代码中,您没有@columns
在$colData
.
淡化说辞。计算机的工作原理是 GIGO。
查看您发布的链接中的代码,您似乎不知道您可以这样做:
use File::Spec::Functions qw( catfile );
...
catfile($ETLSpliter::filepath_results, $ETLSpliter::actual_name);
此外,看起来您正在使用哈希可以完成工作的包:
$ETLSpliter{filepath}
最后,你确实意识到Spliter
是不正确的。伊蒂姆:Splitter
。