2015-07-06 3 views
0

У меня есть ini-файл (конфигурационный файл для операций с базами данных):Возврат значения хэш-функции

[Section1] 
SQL1=select * from <tablename> 
SQL2=insert into table <table name> 

я написал ниже код, чтобы прочитать каждый раздел .ini файла и его работать идеально. Я должен использовать подпрограмму ниже в моем почтовом файле, я хочу вызвать его и передать каждое значение в каждом разделе в хэш и там выполнять операции с базой данных.

ниже код:

sub Read_INI_files_get_initialData { 
    my (%ini_file, $ini_sect); 
    tie %ini_file, 'IniFiles',(-file => "/home/testtool/config/InitialData.ini"); 
    for $ini_sect (keys %ini_file) { 
     %$ini_sect = %{ $ini_file{$ini_sect} }; 
    } 
    print "$Section1{SQL1}\n"; # output prints the 1st SQL1 statement return in .ini file. 
    return (\%Section1); 

} 

Когда я называю эту подпрограмму из основного файла, я не получаю никакого возвращаемого значения, которые я мог бы использовать для дальнейшей OPRATION базы данных.

+0

У вас есть 'return' заявление перед последним' print', поэтому он никогда не будет достигнута .. –

+0

Thats OK .. но когда я звоню та же подпрограмма в основном файле, ничего не возвращает. –

+0

Кажется, вы возвращаете ссылку на хэш '% Section1'? –

ответ

1

У вас есть смешение с вашими переменными. Также я не уверен, что вы пытаетесь сделать. Если вы хотите прочитать только Section1, рассмотрите этот пример (который у меня есть не протестирован).

use strict; 
use warnings; 
use feature 'say'; 

sub Read_INI_files_get_initialData { 
    tie my %ini_file, 'IniFiles',(-file => "/home/testtool/config/InitialData.ini"); 

    say "$ini_file{Section1}->{SQL1}"; 

    # return a hashref 
    return { $ini_file{Section1} }; 

} 

В основном то, что вы сделали следующее:

for $ini_sect (keys %ini_file) { 
     %$ini_sect = %{ $ini_file{$ini_sect} }; 
    } 
    print "$Section1{SQL1}\n"; # output prints the 1st SQL1 statement return in .ini file. 
    return (\%Section1); 

The $ini_sect объявлена ​​выше, но затем использовать его для перебора ключей. Поэтому при первом запуске for он получит ключ от %ini_file. Теперь в цикле вы предпочтете, что на самом деле это hashref, разыщите его и назначьте другой хеш (который вы разыменовали из хэша ref с помощью ключа). Здесь есть два вопроса.

Во-первых, вы переписываете переменную, содержащую ключ. На следующей итерации это значение исчезнет.

Во-вторых, и более важно, вы пытаетесь разыменовать строку. Это не сработает. Если вы добавите use strict и use warnings к вашей программе (как я сделал выше), он скажет вам Невозможно использовать строку («Раздел1») как HASH ref .... Поэтому возникает другая проблема.

Что он также скажет вам, что Глобальный символ "% Section1" требует явного имени пакета в обратном направлении, потому что вы его никогда не объявляли.

Подумайте, что вы хотите сделать в своей функции. Используйте столько переменных, сколько вам нужно, и дайте им значимые имена. Вы просто хотите прочитать первый раздел файла? Продолжайте, обратитесь к нему напрямую.

Вы хотите сделать копию всего этого? Возможно, tie - не самый лучший вариант. См. Config::IniFiles, как это сделать с интерфейсом OOp.

1

Если я правильно вас понимаю, вы хотите использовать связанный хеш для доступа к операторам SQL, указанным в вашем файле конфигурации. Это может быть сделано с помощью вложенной хэш структуры $ini_file{SectionName}{VariableName}:

use strict; 
use warnings; 
use Config::IniFiles; 

my %initialData = Read_INI_files_get_initialData(); 

print $initialData{Section1}{SQL1} . "\n"; # Prints the Section1 SQL1 statement from .ini file.       

sub Read_INI_files_get_initialData { 
    my %ini_file; 
    tie %ini_file, 'Config::IniFiles', (-file => "InitialData.ini"); 
    return %ini_file; 
} 
+0

Том ваш код не работает, он ничего не печатает, ... –

+0

Том, что ваш код не работает, он ничего не печатает вне подпрограммы .. Он печатает пустое значение этого оператора: print $ ini_file {Section1} {SQL1}. "\ П"; но внутри подпрограммы он печатает инструкцию SQL1. В моем исходном коде также я столкнулся с той же проблемой. –

+0

Я вызывал '$ ini_file' в основном скрипте - теперь я изменил это на' $ initialData' - обратите внимание, что если вы используете 'use strict; используйте предупреждения: '(которым вы должны быть!) сценарий не должен запускаться вообще. – tcn

Смежные вопросы