perl修改sub中的hash

时间:2013-01-17 16:06:51

标签: perl pointers reference hashtable

我无法理解引用如何与子哈希中的哈希一起使用。

在此代码中,我尝试更改%config子例程中的handleOptions()

sub handleOption;

my %config = (  gpg => "",
                output => "",
                pass => "",
                host => "",
                type => "");

handleOptions(\%config);
print "\n";
print Dumper \%config;

sub handleOptions
{
    my ($gpgpath,$type,$pass,$host);
    my $pConfig=@_;

    GetOptions ("gpg=s" => \$gpgpath,
                "type=s" => \$type,
                "host=s" => \$type,
                "pass=s"=>\$pass);
    $pConfig->{'gpg'} = $gpgpath;
    $pConfig->{'type'} = $type;
    $pConfig->{'pass'} = $pass;
    $pConfig->{'host'} = $host;
    print Dumper %$pConfig;
}

当我将--gpg='/home/daryl/gpg/pass.gpg提供给cli:

中的选项时,这是输出
$VAR1 = 'pass';
$VAR2 = undef;
$VAR3 = 'gpg';
$VAR4 = '/home/daryl/gpg/pass.gpg';
$VAR5 = 'type';
$VAR6 = undef;
$VAR7 = 'host';
$VAR8 = undef;

$VAR1 = {
          'pass' => '',
          'gpg' => '',
          'type' => '',
          'output' => '',
          'host' => ''
        };

我该怎么办?

1 个答案:

答案 0 :(得分:4)

如果您访问use strictuse warnings,则会看到有关使用标量作为哈希引用的错误消息。那会让你觉得问题出在这一行:

my $pConfig=@_;

您正在为变量@_分配数组$pConfig的标量上下文。这意味着$pConfig正在存储数组@_中的元素数量。

相反,您可以这样做:

my ($pConfig) = @_;正如KerrekSB建议的那样,或者:

my $pConfig = shift;(自shift @_来自<{1}}

有关在标量上下文中调用非标量的更多信息,请查看perldoc perldata。此外,除非您正在编写单行或短暂删除脚本,否则请务必始终use strictuse warnings