Perl 返回散列值

Perl 返回散列值,perl,Perl,我有.ini文件(用于数据库操作的配置文件): 当我从主文件调用此子例程时,我没有得到任何可用于进一步数据库操作的返回值。您的变量混淆了。我也不知道你想做什么。如果您只想阅读章节1>代码>,请考虑这个例子(我有未测试)。 基本上,您所做的是: 上面声明了$ini_sect,但是您可以使用它来迭代键。因此,第一次运行的,它将获得%ini\u文件的密钥。现在,在循环中,您确定它实际上是一个hashref,取消引用它并分配另一个hash(使用键从hashref中取消引用)。这里有两个问题 首先,覆盖

我有.ini文件(用于数据库操作的配置文件):


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

您的变量混淆了。我也不知道你想做什么。如果您只想阅读<代码>章节1>代码>,请考虑这个例子(我有<强>未测试)。
基本上,您所做的是:

上面声明了
$ini_sect
,但是您可以使用它来迭代键。因此,第一次运行的
,它将获得
%ini\u文件
的密钥。现在,在循环中,您确定它实际上是一个hashref,取消引用它并分配另一个hash(使用键从hashref中取消引用)。这里有两个问题

首先,覆盖保存键的变量。在下一次迭代中,该值将消失

其次,更重要的是,,您正在尝试取消对字符串的引用。那不行。如果在程序中添加
use strict
use warnings
(如上所述),它将告诉您不能使用字符串(“Section1”)作为散列引用。。。。因此,还有另一个问题

它还将告诉您,全局符号“%Section1”在返回中需要显式的包名,因为您从未声明过它

想想你想在你的功能中做什么。根据需要使用尽可能多的变量,并为它们指定有意义的名称。您只想读取文件的第一部分吗?继续,直接引用它


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

如果我理解正确,您希望使用绑定哈希访问配置文件中指定的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;
}

在最后一次
打印之前,您有一个
return
语句,因此它永远不会到达..没关系。。但是当我在主文件中调用相同的子例程时,它什么也不返回..看起来你是在返回对
%Section1
散列的引用?是的,那一定是复制/粘贴问题或类似的问题。您返回的变量不存在。您应该
使用严格的
使用警告
。它会告诉你的。请在你编写的所有代码中添加
使用严格的
使用警告。您试图使用一个名为
%Section1
的散列,但该散列不存在。Tom您的代码不工作,它不会在子例程之外再次打印任何内容。。它打印该语句的空白值:print$ini_file{Section1}{SQL1}。“\n”;但在子例程内部,它正在打印SQL1语句。在我最初的代码中,我也面临着同样的问题。我在主脚本中调用了
$ini_file
——我现在将其更改为
$initialData
——请注意,如果您使用的是
请使用strict;使用警告(您应该是!)脚本根本不应该运行。
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);   

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