返回哈希值

时间:2015-07-06 09:47:53

标签: perl

我有.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);   

}

我写了下面的代码来阅读.ini文件的每个部分及其完美的工作原理。我必须在我的邮件文件中使用下面的子程序,我想调用它并将每个部分中的每个值传递到那里的哈希并执行数据库操作。

下面是代码:

{{1}}

当我从主文件中调用此子例程时,我没有获得任何可用于进一步数据库操作的返回值。

2 个答案:

答案 0 :(得分: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 ref ... 。所以还有另一个问题。

它还告诉你的是全球符号"%Section1"在返回中需要显式包名称,因为您从未声明它。

想想你在功能中想做什么。根据需要使用尽可能多的变量,并为它们提供有意义的名称。你只想阅读文件的第一部分吗?来吧,直接参考。

你想复制整件事吗?也许tie不是最好的选择。请参阅Config::IniFiles如何使用OOp界面执行此操作。

答案 1 :(得分: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;
}