2012-12-20 25 views
5

मुझे perl subroutine defination में सरणी प्रकार तर्क घोषित करते समय संकलन त्रुटि का सामना करना पड़ रहा है। मेरे पूरा कोड के नीचे है:पर्ल में subroutines तर्कों के लिए सरणी और हैश डेटा प्रकार कैसे पास करें?

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. 

कृपया चौथाई कोड डिबगिंग मेरी मदद। मुझे यकीन है कि यह कुछ के लिए केक का टुकड़ा होगा।

+3

perl में तर्क प्रकार घोषित करने के लिए कोई तंत्र नहीं है। प्रोटोटाइप ऐसा लगता है कि वे पहली नज़र में करते हैं, लेकिन वास्तव में एक पूरी तरह से अलग उद्देश्य प्रदान करते हैं; आपको उनका उपयोग नहीं करना चाहिए। – ysth

उत्तर

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

} 
+0

धन्यवाद आपके मूल्यवान उत्तर के लिए RobEarl –

+0

यह टिप्पणी मेरे लिए उपयोगी थी (2015 में) जब एक वर्ष से अधिक समय तक PHP और जावास्क्रिप्ट में काम किया था, और पर्ल में subs के साथ @_ संदर्भ के बारे में भूल गया था। धन्यवाद –

6

पर्ल प्रोटोटाइप नामकरण पैरामीटर के लिए नहीं हैं, या यहां तक ​​कि उन्हें प्रकार देने के लिए, वे मूल्यांकन संदर्भ बनाने के लिए हैं। प्रोटोटाइप से छुटकारा पाने के

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

या पूरी तरह से:: आप इस तरह सबरूटीन्स संशोधित करने की आवश्यकता

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

उत्कृष्ट अवास्तविक। आपका संदेश ज़ोरदार और स्पष्ट मिला :) धन्यवाद –

9

यह वास्तव में सरल है: prototypes का उपयोग न करें यदि आप वे कैसे काम पता नहीं है। अपने कोड चलाने के लिए, से सबरूटीन घोषणा बदलने के लिए:

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); 
+0

धन्यवाद आप Matthias! इससे मदद मिली :) इस बात को ध्यान में रखेगा। –

3

आप क्या कर रहे हैं?

पहले! प्रोटोटाइप का उपयोग करने की कोशिश मत करो:

sub ServiceStatus([email protected]){ 

} 

चलो देखते हैं, आप क्या चाहते हैं:

कार्य करने के लिए सरणी या हैश पासिंग एक बहुत पुरानी चाल है:

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

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

यह कैसे उपयोग करने के लिए?

ServiceStatus($serverName, \@serverServices); 

और रेफरी के साथ क्या करना है?

$refToArray->[0]; <- first element of array you pass 
@{$refToArray} <- array you pass to function 
+0

आपकी बहुमूल्य मदद के लिए धन्यवाद loldop। प्रोटोटाइप घोषित करते समय मुझे अपनी गलती मिली लेकिन दुर्भाग्य से आखिरी हिस्से में आपका स्पष्ट संदेश नहीं मिला। –