Я думаю, вы ищете способ обработки файлов конфигурации. Мне нравится Config :: Std для этой цели, хотя на CPAN .
есть много других.
Вот способ обработки только содержимого $cols[0]
, чтобы явно показать, что вам нужно с ним делать:
#!/usr/bin/perl
use strict; use warnings;
# You should not type this. I am assuming the
# environment variables are defined in the environment.
# They are here for testing.
@ENV{qw(VAR1 VAR2 VAR3)} = qw(variable1 variable2 variable3);
while ( my $line = <DATA> ) {
last unless $line =~ /\S/;
chomp $line;
my @components = split qr{/}, $line;
for my $c ( @components ) {
if ( my ($var) = $c =~ m{^\$(\w+)\z} ) {
if ( exists $ENV{$var} ) {
$c = $ENV{$var};
}
}
}
print join('/', @components), "\n";
}
__DATA__
$VAR1/$VAR2/$VAR3
$VAR3/some_string/SOME_OTHER_STRING/and_so_on/$VAR2
$VAR2/$VAR1/some_string/some_string_2/some_string_3/some_string_n/$VAR2
Вместо split
/ join
вы можете использовать s///
для замены шаблонов, которые выглядят как переменные, соответствующими значениями в %ENV
. Для иллюстрации я поместил второй столбец в разделе __DATA__
, который должен содержать описание пути, и превратил каждую строку в хэш-ссылку. Обратите внимание, что я факторизовал фактическую замену на eval_path
, чтобы вы могли попробовать альтернативы, не вмешиваясь в основной цикл:
#!/usr/bin/perl
use strict; use warnings;
# You should not type this. I am assuming the
# environment variables are defined in the environment.
# They are here for testing.
@ENV{qw(VAR1 VAR2 VAR3)} = qw(variable1 variable2 variable3);
my @config;
while ( my $config = <DATA> ) {
last unless $config =~ /\S/;
chomp $config;
my @cols = split /\t/, $config;
$cols[0] = eval_path( $cols[0] );
push @config, { $cols[1] => $cols[0] };
}
use YAML;
print Dump \@config;
sub eval_path {
my ($path) = @_;
$path =~ s{\$(\w+)}{ exists $ENV{$1} ? $ENV{$1} : $1 }ge;
return $path;
}
__DATA__
$VAR1/$VAR2/$VAR3 Home sweet home
$VAR3/some_string/SOME_OTHER_STRING/and_so_on/$VAR2 Man oh man
$VAR2/$VAR1/some_string/some_string_2/some_string_3/some_string_n/$VAR2 Can't think of any other witty remarks ;-)
Выход:
---
- Home sweet home: variable1/variable2/variable3
- Man oh man: variable3/some_string/SOME_OTHER_STRING/and_so_on/variable2
- Can't think of any other witty remarks ;-): variable2/variable1/some_string/some_string_2/some_string_3/some_string_n/variable2