1

我无法理解引用如何与 subs 中的哈希一起工作。

在这段代码中,我尝试在子程序%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.gpgcli 中的选项时的输出:

$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' => ''
        };

我应该如何进行?

4

1 回答 1

4

如果您使用use strictand use warnings,您会看到一条关于使用标量作为哈希引用的错误消息。这会提示您问题出在这一行:

my $pConfig=@_;

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

相反,您可以这样做:

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

my $pConfig = shift;(自动shift来自@_

查看perldoc perldata有关在标量上下文中调用非标量的更多信息。此外,除非您正在编写单行或简短的一次性脚本,否则请确保始终使用use strictuse warnings.

于 2013-01-17T16:16:10.310 回答