6

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

コンパイル エラー

>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.

このコードのデバッグを手伝ってください。一部の人にとっては簡単なことだと確信しています。

4

4 に答える 4

9

それは本当に簡単です:プロトタイプがどのように機能するか分からない場合は、プロトタイプを使用しないでください。コードを実行するには、サブルーチン宣言を次のように変更します。

sub ServiceStatus ($serverName,@serverServices)
{ #...

に:

sub ServiceStatus {
    my ($serverName, @serverServices) = @_;

編集: サブルーチンに複数の配列/ハッシュを渡す必要がある場合、または配列/ハッシュを他の値の前に渡す必要がある場合は、参照渡しする必要があります。

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);
于 2012-12-20T09:49:14.083 に答える
6

Perl プロトタイプは、パラメーターに名前を付けるためではなく、型を与えるためのものでもなく、評価コンテキストを作成するためのものです。サブルーチンを次のように変更する必要があります。

sub ServiceStatus ($@){
  my ($serverName,@serverServices) = @_;   
  # ...
}

または、プロトタイプを完全に削除します。

sub ServiceStatus {
  my ($serverName,@serverServices) = @_;   
  # ...
}
于 2012-12-20T09:49:10.497 に答える
4
sub ServiceStatus
{
    my ($serverName,@serverServices) = @_; # Declare variables and populate from @_, the parameter list.
    ...

}
于 2012-12-20T09:49:01.313 に答える
3

何してるの?

初め!プロトタイプを使用しようとしないでください:

sub ServiceStatus($@){

}

見てみましょう、あなたが欲しいもの:

配列またはハッシュを関数に渡すことは非常に古いトリックです。

sub ServiceStatus{
my ($firstArgument, $refToSecondArgumentWhichIsArray) = @_;

#return undef unless defined($firstArgument&&$refToSecondArgumentWhichIsArray);
...
}

これを使用する方法は?

ServiceStatus($serverName, \@serverServices);

そして、refをどうするか?

$refToArray->[0]; <- first element of array you pass
@{$refToArray}    <- array you pass to function
于 2012-12-20T09:54:33.507 に答える