ЗАКЛЮЧИТЕЛЬНОЕ ПОСЛАНИЕ ДЛЯ ЭТОГО ВОПРОСА: Основываясь на ваших последних обновлениях, я полагаю, что следующий код иллюстрирует, как нет проблем с использованием /:/
в качестве первого аргумента 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 скажет вам, с какими ошибками он может столкнуться, а не предположить.
Объявите переменные в наименьшей применимой области.
Нет необходимости присваивать $_
для $conline
в теле цикла, когда вы можете сделать это в операторе while
.
В исходном коде вы ничего не помещали в @columns
или не делали ничего полезного с $colData
.
Приглушите риторику. Компьютеры работают по принципу GIGO.
Глядя на код по ссылке, которую вы разместили , похоже, что вы не знаете, что можете сделать:
use File::Spec::Functions qw( catfile );
...
catfile($ETLSpliter::filepath_results, $ETLSpliter::actual_name);
Кроме того, похоже, что вы используете пакет, в котором хэш бы выполнил свою работу:
$ETLSpliter{filepath}
Наконец, вы понимаете, Spliter
неверно. ITYM: Splitter
.