2012-02-17 3 views
1

배열의 해시를 인수로 취하는 서브 루틴을 작성하려고합니다. 그러나 배열 중 하나를 검색하려고하면 배열 자체 대신 배열의 크기를 얻는 것 같습니다.펄에서 서브 루틴으로 전달 된 해시에서 배열을 검색하는 방법

my(%hash) = (); 
$hash{"aaa"} = ["blue", 1]; 

_subfoo("test", %hash); 

sub _subfoo { 

    my($test ,%aa) = @_; 

    foreach my $name (keys %aa) { 
     my @array = @{$aa{$name}}; 
     print $name. " is ". @array ."\n"; 
    } 
} 

이것은 예상 한대로 (파란색, 1) 대신 2를 반환합니다. 서브 루틴에서 해시 배열을 처리하는 다른 방법이 있습니까?

스택 오버플로, 처음 포스터 및 프로그래밍 처음부터 너무 단순한 경우 사과드립니다.

+1

코드의 들여 쓰기가 매우 복잡합니다. vim과 같은 자동 들여 쓰기 기능이있는 적절한 텍스트 편집기를 사용해야합니다. – TLP

답변

10

당신은 바로 여기 스칼라 문맥으로 @array 배열을 옮기고 :

print $name. " is ". @array ."\n"; 

배열을 스칼라 문맥으로하면 배열에 당신 요소의 수를 제공하고 @array 2 개 요소가 발생합니다.

print $name . " is " . join(', ', @array) . "\n"; 
print $name, " is ", @array, "\n"; 
print "$name is @array\n"; 

을 당신은 당신의 @array의 요소를 볼 수 있습니다 :이 대신 중 하나를 시도하십시오. join을 사용하면 원하는대로 요소를 붙여 넣을 수 있습니다. 두 번째 것은 목록 컨텍스트에서 @array을 평가하고 값을 분리하지 않고 함께 매시합니다. 세 번째 요소는 $" (기본값은 단일 공백 ​​임)과 함께 해당 요소를 결합하여 @array을 보간합니다.

+4

+1. 'print '$ name은 @array \ n "이라고 쓰면,'@ array'의 원소를 암시 적으로'$"'(기본값은'''')로 합치 게됩니다. – ruakh

+0

@ruakh : 예, 감사합니다. 귀하의 의견이 들어 왔을 때 그 옵션 (및 perldoc.perl.org 링크)을 추가하고있었습니다. –

+0

정말 고마워요. 나는 결코 그 생각을하지 못했을 것입니다 ... – user1215331

4

mu가 너무 짧기 때문에 배열을 스칼라 컨텍스트로 사용 했으므로 요소 대신 길이가 반환됩니다. 나는 당신의 코드에 대한 다른 조언을했다.

인수를 인수로 전달하면 배열이나 해시 중 일부가 좋은 생각 일 때가 있습니다. 이것은 작동

foo(@bar, @baz); 
sub foo {      # This will not work 
    my (@array1, @array2) = @_; # All the arguments will end up in @array1 
    ... 
} 

그러나 :

foo(\@bar, \@baz); 
sub foo {     
    my ($aref1, $aref2) = @_; 
    ... 
} 

당신은 찾을 수 있습니다 이유는 배열과 해시이 불가능 같은 것을 만드는 서브 루틴에 전달되기 전에리스트로 확장한다는 것이다 귀하의 경우, each 좋은 기능입니다, 그것은 조금 더 깔끔하게 배열을 dereferencing하게 만들 것입니다.

foo("test", \%hash); # note the backslash to pass by reference 

sub foo { 
    my ($test, $aa) = @_; # note use of scalar $aa to store the reference 

    while (my ($key, $value) = each %$aa)) { # note dereferencing of $aa 
     print "$key is @$value\n";   # ...and $value 
    } 
} 
+0

와우, 다시 한번 이것도 좋습니다. 당신은 당신의 도움을 요청할 것입니다. 불행하게도 +1을 대신 할 담당자는 없습니다. – user1215331

+0

첫 번째 예에 대한 +1과 의견 : 원칙적으로 프로토 타입에서는 가능하지만 절대적으로 필요한 경우를 제외하고는 피해야합니다 :'sub foo (\ @ \ my @ array2 = @ {shift()};}'{@ bar, @baz}, {@} – flesk

관련 문제