FINAL POST:使用に問題がないかあなたの最新の更新プログラムに基づいて、私は次のコードは示して信じて/:/
をsplit
の最初の引数として使用します。また、1ではなく、グローバル変数に頼るよりも、関数に引数を使用する場合、コードを読みやすくであることを指摘:
#!/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'
];
エラーなし ... 警告なししたがって、あなたが私たちを示していないことを主張れている起こっている何か他のものがあります。
その他備考:
使用字句ファイルハンドルとlet perlが、それは仮定ではなく、発生する可能性のあるどのようなエラーを教えてくれ。
適用可能な最小スコープの変数を宣言します。
ループの本体に$_
〜$conline
を割り当てる必要がない場合は、while
ステートメントでこれを行うことができます。
元のコードでは、@columns
に何かを入れていないか、$colData
と一緒に有用なことをしていませんでした。
レトリックを下げてください。コンピュータはGIGOの原理に基づいて動作します。あなたはあなたができることに気づいていないよう
がthe link you postedのコードを見てみると、それは見えます:あなたは、ハッシュが行われていたパッケージを使用しているよう
use File::Spec::Functions qw(catfile);
...
catfile($ETLSpliter::filepath_results, $ETLSpliter::actual_name);
さらに、それが見えます仕事:
$ETLSpliter{filepath}
最後に、あなたはSpliter
が間違っている実現します。 ITYM:Splitter
。
最後に不要な「 '; next;」を削除してもこれは起こりますか? –
split()に使用されている/文字を入れるとすぐに壊れているようです。 – kthakore
それはまだあります。たとえ次がなくても! – kthakore