perl在sub中修改hash

perl在sub中修改hash,perl,pointers,reference,hashtable,Perl,Pointers,Reference,Hashtable,我很难理解subs中引用如何与哈希一起工作 在这段代码中,我尝试在handleOptions()子例程中更改%config: sub handleOption; my %config = ( gpg => "", output => "", pass => "", host => "", type => ""); handleOpti

我很难理解subs中引用如何与哈希一起工作

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

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;
}
下面是我给cli中的选项指定
--gpg='/home/daryl/gpg/pass.gpg
时的输出:

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

如何继续?

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

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

相反,您可以执行以下操作:

my($pConfig)=@如KerrekSB建议,或:

my$pConfig=shift(自动从
@
移动


有关在标量上下文中调用非标量的更多信息,请参阅。此外,除非您正在编写一行或一个简短的一次性脚本,否则请确保始终
使用strict
使用warnings
如果要
使用strict
使用warnings
,您会看到一条关于将标量用作哈希引用的错误消息。这会提示您问题出在这一行:

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

相反,您可以执行以下操作:

my($pConfig)=@如KerrekSB建议,或:

my$pConfig=shift(自动从
@
移动


有关在标量上下文中调用非标量的更多信息,请参阅。此外,除非您正在编写一行或一个简短的一次性脚本,否则请确保始终
使用strict
使用warnings

尝试以下操作:
my($pConfig)=@完美演示始终使用严格和警告的价值。
使用严格;使用警告不会帮助他解决子程序声明不匹配的问题;使用警告my($arg1,$arg2,@garbage)=@@TLP通过“子程序声明不匹配”我指的是
子操作声明与子例程本身的名称不匹配。请尝试以下操作:
my($pConfig)=@完美演示始终使用严格和警告的价值。
使用严格;使用警告不会帮助他解决子程序声明不匹配的问题;使用警告my($arg1,$arg2,@garbage)=@@TLP通过“子程序声明不匹配”我指的是
子操作声明与子例程本身的名称不匹配。非常感谢您解决了我的问题:)我对perl非常陌生,我仍然经常忘记设置这些“严格/警告”lines@Azryel-不客气。我建议您选择一本相对较轻的书来阅读,这本书可以帮助您启动和运行,和/或是一本更厚但更全面的书。非常感谢您解决了我的问题:)我对perl非常陌生,我仍然经常忘记设置这些“严格/警告”lines@Azryel-不客气。我建议你选择一本相对较轻的书来阅读,这本书会让你振作起来,并且/或者是一本更厚的书,但是更全面。