如何将数组和哈希数据类型传递给perl中的子例程参数?

Avi*_*wal 6 debugging perl subroutine

我在perl子例程定义中声明数组类型参数时遇到编译错误.我的完整代码如下:

use Data::Dumper;
use Win32;
use Win32::Service;
use strict;
use warnings;
my @Services = qw(NNMAction RpcEptMapper smstsmgr SNMPTRAP);
my $server   = 'nnmi.hclt.corp.hcl.in';
ServiceStatus($server , @Services);

sub ServiceStatus ($serverName,@serverServices)
{       my %statcodeHash = (     '1' => 'stopped',
                             '2' => 'start pending',
                             '3' => 'stop pending',
                             '4' => 'running',
                             '5' => 'continue pending',
                             '6' => 'pause pending',
                             '7' => 'paused'            );

  foreach my $serv (@serverServices)
  {     my %status;
     my $ret = Win32::Service::GetStatus($serverName , $serv , \%status);
     if ($ret)
     {       print "success \t$statcodeHash{$status{CurrentState}} \t$serv\n";
     }
     else
     {       print Win32::FormatMessage(Win32::GetLastError()), "\n";
     }
   }
 }   
Run Code Online (Sandbox Code Playgroud)

编译错误

>perl -w perl_RemoteServiceStatus.pl
Prototype after '@' for main::ServiceStatus : $serverName,@serverServices at per
l_RemoteServiceStatus.pl line 21.
Illegal character in prototype for main::ServiceStatus : $serverName,@serverServ
ices at perl_RemoteServiceStatus.pl line 21.
main::ServiceStatus() called too early to check prototype at perl_RemoteServiceS
tatus.pl line 16.
Global symbol "@serverServices" requires explicit package name at perl_RemoteSer
viceStatus.pl line 31.
Global symbol "$serverName" requires explicit package name at perl_RemoteService
Status.pl line 33.
Execution of perl_RemoteServiceStatus.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

请帮我调试代码.我相信这对某些人来说是件小事.

Mat*_*ias 9

这很简单:如果你不知道它们是如何工作的,不要使用原型.要使代码运行,请从以下位置更改子例程声明:

sub ServiceStatus ($serverName,@serverServices)
{ #...
Run Code Online (Sandbox Code Playgroud)

至:

sub ServiceStatus {
    my ($serverName, @serverServices) = @_;
Run Code Online (Sandbox Code Playgroud)

编辑:如果您需要将多个数组/哈希传递给子例程,或者在某些其他值之前传入数组/哈希,则必须通过引用传递它:

sub complex_params {
    my ($array1, $scalar, $hash, $array2) = @_;

    # dereference
    my @a1 = @$array1;
    my @a2 = @$array2;
    my %h  = %$hash;

    #...
}

# reference
complex_params(\@some_array, $some_scalar, \%some_hash, \@other_array);
Run Code Online (Sandbox Code Playgroud)


per*_*eal 6

Perl原型不是用于命名参数,甚至不是为它们提供类型,而是用于创建评估上下文.你需要像这样修改子程序:

sub ServiceStatus ($@){
  my ($serverName,@serverServices) = @_;   
  # ...
}
Run Code Online (Sandbox Code Playgroud)

或完全摆脱原型:

sub ServiceStatus {
  my ($serverName,@serverServices) = @_;   
  # ...
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*arl 4

sub ServiceStatus
{
    my ($serverName,@serverServices) = @_; # Declare variables and populate from @_, the parameter list.
    ...

}
Run Code Online (Sandbox Code Playgroud)