2012-11-09 5 views
0

나는 다음과 같은 펄 코드를 가지고 : 나는 같은 명령이 실행되면채우기 및 해시에 액세스하는 배열

@searchInfo =(); 

sub main() 
{ 
    processCmdLine(); 

    foreach my $info (@searchInfo) 
    { 
     print "Search field: " . $info{field} . "\n"; 
     print "Search value: " . $info{value} . "\n"; 
    } 
} 

sub processCmdLine() 
{ 
    while(@ARGV > 1) 
    { 
     $rec = {}; 
     $rec{field} = shift(@ARGV); 
     $rec{value} = shift(@ARGV); 
     print "$info{field} = $info{value}\n"; 
     push @searchInfo, $rec; 
    } 
} 

가 : script.pl f1 v1 f2 v2, 내가

f1 = v1 
f2 = v2 
Search field: 
Search value: 
Search field: 
Search value: 

가 난 다음과 같은 출력을 얻을 수를 코드는 this tutorial에 있습니다.

배열 내의 해시가 값이 비어있는 이유는 무엇입니까?

+2

항상 처음부터 사용하십시오 :'use strict; 경고를 사용하라. 그것은 많은 실수를 설명 할 것입니다. –

답변

1

항상 use strict; use warnings;을 사용하십시오 !!! %info%rec이라는 해시에 액세스하고 있지만 그와 같은 변수는 없다고 말할 수 있습니다.

해시 값은 스칼라입니다. 따라서 해시를 포함 할 수 없습니다. 이것은 해시에 대한 참조를 사용하여 근사값을 구할 수 있습니다. $rec = {};을 사용하여 이것을 인식하는 것 같지만 그 변수를 다시 사용하지 마십시오.

수정 :

my $rec = {}; 
$rec->{field} = shift(@ARGV); 
$rec->{value} = shift(@ARGV); 
push @searchInfo, $rec; 

클리너 수정 :

my %rec; 
$rec{field} = shift(@ARGV); 
$rec{value} = shift(@ARGV); 
push @searchInfo, \%rec; 

너무 가져 오기 수정하는 것을 잊지 마십시오

print "Search field: $info->{field}\n"; 
print "Search value: $info->{value}\n"; 

그런데 왜 당신이 왕창 만드는을 하나의 열쇠로 해시 중?! 당신은 아마 할 찾으 셨나요?

%search_info = @ARGV; 

가 그런 다음 가져 오기가

for my $key (keys(%search_info)) { 
    my $val = $search_info{$key}; 
    print "Search field: $key\n"; 
    print "Search value: $val\n"; 
} 
+0

일부 펄 자습서를 읽어야한다고 생각합니다. 나는'$ rec {field}'와'$ rec -> {field}'가 같은 것이라고 생각했습니다. 감사! – tvStatic

+1

'$ rec {$ key} '는 해쉬'% rec'의 키'$ key'에 저장된 값을 의미합니다. '$ rec -> {$ key}'는'$ rec'에 의해 참조 된 해쉬의 키'$ key'에 저장된 값을 의미합니다. – ikegami

0

당신은 당신의 서브 루틴 내부 @ARGV 사용해서는 안 될 것이다. 대신 @_를 사용하고 @ARGV를 매개 변수로 사용하여 서브 루틴을 호출하십시오. 이렇게하면 나중에 다른 배열을 서브 루틴에 전달하려는 경우 정의를 하드 코드 한 모든 위치를 검색하는 대신 원본 호출 만 변경하면됩니다. 이렇게하면 자신과 다른 사람이 코드를 접하는 시간을 절약 할 수 있습니다. 또한 명령 행에서 args를 입력하여 테스트 할 필요없이 테스트를 위해 서브 루틴에서 많은 값을 가진 배열을 던질 수 있습니다. 이 examply에만 @ARGV 내 권장 변화를 묘사하고, 대신에 참조의 해시를 생성하여 쓸모없는 참조를 해결

sub processCmdLine() { 
     while(@_ > 1) { 
      my %rec; 
      ($rec{field}, $rec{value}) = @_; 
      print "$info{field} = $info{value}\n"; 
      push @searchInfo, $rec; 
     } 
    } 
    processCmdLine(@ARGV); 

참고 :

sub processCmdLine() { 
     while(@ARGV > 1) {  
      $rec = {}; 
      $rec{field} = shift(@ARGV); 
      $rec{value} = shift(@ARGV);j 
      print "$info{field} = $info{value}\n"; 
      push @searchInfo, $rec; 
     } 
    } 

이된다. ikegami은 여러 개의 단일 키 해시 생성과 관련된 설계 문제를 수정하지 않습니다.