2015-07-06 39 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