Я пытаюсь передать из Main.pl в подпрограмму (в ReadConfigFile.pm) хэш по ссылке и скалярное значение. Скалярная переменная — это путь к файлу конфигурации, и после открытия этого файла я хочу заполнить хэш некоторыми его значениями. Как мне передать хэш по ссылке и скаляр, чтобы у меня были значения хэша, доступные для использования в Main.pl
Я много читал, но не могу заставить это работать. Я понимаю, что не могу = @_; в моей подпрограмме, поскольку это создает новый хеш.
Я пробовал следовать методу прототипа, он заполняет хеш нормально, но в Main.pl хэш пустой.
Main.pl
# Read the config file. Return 3 scalars and a hash
my %apps;
my ($schema, $directory, $staticFile) = readConfigFile(\%apps, $configFilePath);
my %app_list = %apps; # ive tried this in, out and in a variety of states
foreach my $name (sort keys %app_list) {
print "\nMAIN $name";
}
# this is empty
ReadConfigFile.pm
sub readConfigFile (\%$) {
my ($apps_ref, $configFilePath) = @_;
# also tried
# $apps_ref = shift but then configFilePath is empty
# linearray is each line from open config file split by :
$apps_ref{$lineArray[1]}{id} = $lineArray[1];
$apps_ref{$lineArray[1]}{name} = $lineArray[2];
$schema = $lineArray[1];
$directory = $lineArray[1];
$staticFile = $lineArray[1];
return ($schema, $directory, $staticFile);
configFile.txt
APP:1101:ACTIVITY
APP:1102:EVENTS
APP:1103:PERFORMANCE
APP:1104:LOCATION
STATIC_FILE:static_file.sql
SCHEMA:CAASS
DIRECTORY:CAASS
Я хочу вернуть 3 скалярные переменные и хэш, чтобы я мог использовать их в Main.pl и передавать другим сабвуферам.
Я также попытался передать только имя файла конфигурации и вернуть 4 переменные, 3 скаляра и хэш.
Я ожидаю, что кто-то взломает это за считанные минуты, но я просто не могу найти комбинацию \ и @, % и $, чтобы это сработало.
Спасибо за любую помощь или идеи.
Редактировать 1: Main.pl
my %apps;
my ($schema, $directory, $staticFile) = readConfigFile(\%apps, $configFilePath);
foreach my $name (sort keys %apps) {
print "\nMAIN $name";
}
Реадконфигфиле
sub readConfigFile () {
my $apps_ref = shift;
my $configFilePath = $_[0];
#Fill It
$apps_ref{$lineArray[1]}{id} = $lineArray[1];
$apps_ref{$lineArray[1]}{name} = $lineArray[2];
# This shows results
foreach my $name (sort keys %apps_ref) {
print "\nreadConfigFile $name";
}
Но ценности не возвращаются в Main.pl
edit 2: Так что мне все еще интересно, как это можно заставить работать. Но я напал на это по-другому, и это работает
Main.pl
my ($schema, $directory, $staticFile, %apps) = readConfigFile($configFilePath);
foreach my $name (sort keys %apps) {
print "\nMAIN $name";
}
Реадконфигфиле
sub readConfigFile () {
my $configFilePath = $_[0];
my %apps;
#Fill It
%apps{$lineArray[1]}{id} = $lineArray[1];
$apps{$lineArray[1]}{name} = $lineArray[2];
foreach my $name (sort keys %apps) {
print "\nreadConfigFile $name";
}
return ($schema, $directory, $staticFile, %apps);
Оба комплекта выключают выходное шоу.
use strict; use warnings qw( all );
!!! Нашел бы проблему - person ikegami   schedule 05.06.2019