Ваш код имеет некоторые проблемы. Давайте сначала исправим это.
# Package names should start with upper case unless they are pragmas.
package SetVariables;
# Do this EVERYWHERE. It will save you hours of debugging.
use strict;
use warnings;
sub readConfig{
# Use the three argument form of open()
open( my $fh, '<', "workflows.config")
or die "Error opening config file: $!\n";
my %config;
# Use an explicit variable rather than $_
while( my $line = <$fh> )
{
chomp $line; # One chomp of the line is sufficient.
($s_var, $s_val) = split "=", $line;
$config{$s_var} = $s_val;
print "set $s_var = $s_val\n";
}
close $fh;
return \%config;
}
Тогда используйте так:
use SetVariables;
my $config = SetVariables::readConfig();
print "$_ is $config->{$_}\n"
for keys %$config;
Но вместо того, чтобы делать все это самостоятельно, посмотрите на множество модулей конфигурационных файлов на CPAN . Рассмотрим Config :: Any , Config :: IniFiles , Config :: JSON .
В своем комментарии вы отмечаете, что пытаетесь работать с несколькими файлами, основным кодом и парой пакетов.
Один из распространенных шаблонов - это загрузить вашу конфигурацию в ваш основной код и передать ее (или выделить ее элементы) потребляющему коду:
package LoadConfig;
sub read_config {
my $file = shift;
my $config;
# Do stuff to read a file into your config object;
return $config;
}
1;
Между тем в другом файле:
package DoStuff;
sub run_some_tests {
my $foo = shift;
my $bar = shift;
# Do stuff here
return;
}
sub do_junk {
my $config;
my $foo = $config->{foo};
# Do junk
return;
}
1;
А в вашем основном скрипте:
use DoStuff;
use LoadConfig;
my $config = LoadConfig::read_config('my_config_file.cfg');
run_some_tests( $config->{foo}, $config->{bar} );
do_junk( $config );
Итак, в run_some_tests()
я извлекаю пару элементов из конфига и передаю их по отдельности. В do_junk()
я просто передаю всю конфигурационную переменную.