2015-07-06 99 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); 

} 

當我打電話從主文件這個子程序,我不明白,我可以用於進一步的數據庫調度研究任何返回值。

+0

你有最後的'print'前'return'語句,所以它永遠不會達到.. –

+0

那行..但是當我打電話主文件中的子例程相同,它不返回任何內容。 –

+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); 

$ini_sect以上聲明,但你用它來遍歷鍵。因此,for第一次運行時,將獲得密鑰%ini_file。現在在循環中,你假設它實際上是一個hashref,對其進行解引用並分配另一個散列(使用該鍵從散列引用中取消引用)。這裏有兩個問題。

首先,您覆蓋保存密鑰的變量。在下一次迭代中,該值將消失。

其次,和更重要的,您試圖取消引用一個字符串。這是行不通的。如果你添加use strictuse warnings給你的程序(就像我上面所做的那樣),它會告訴你不能使用字符串(「Section1」)作爲HASH參考...。所以還有另一個問題。

它還會告訴你的是,全局符號「%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}。 「\ n」 個;但在子程序中它正在打印SQL1語句。在我最初的代碼中,我也遇到了同樣的問題。 –

+0

我在主腳本中調用了'$ ini_file' - 我現在已將它改爲'$ initialData' - 注意如果您使用'use strict;使用警告;'(你應該!)腳本不應該運行。 – tcn