2014-07-17 2 views
1

내가 좋아하는 것 처음 선언 내 @Array반환하는 배열을 처리하는 서브 루틴?

my @Array; 

for (my $i=1; $i <= 10000; $i++) { 

ProsArray(\@Array); 

} 


sub ProsArray { 

    my @Array = @{$_[0]}; 
    #do stuff to @Array (e.g., remove or add elements... 
    push(@Array,10); 
    return(@Array); 

} 

그러나, 서브 루틴의 역할에 -하지 @Array에 이전 반복에서 반환합니다.

나는 그래서 반환 된 배열이 아닌 초기를 처리 할

while(...){ 
@Array = ProsArray(\@Array); 
} 

같은 것을하고 싶습니다. 코멘트에서

+0

그리고 당신이 쓴 코드 문제점은 무엇입니까? – jkeuhlen

+0

서브 루틴에서'@ Array'의 일부 요소를 제거하려고합니다. 내가 (soubroutine에서) 그렇게 한 후에 그것을 출력 할 때, 배열은 내가 원하는대로이다. 그러나 서브 루틴이 다음 반복에서 그것을 처리하려고 할 때, 그 요소는 여전히 제거되지만 그들의 위치는'undef' 값입니다 (서브 루틴을 호출하기 전에 배열을 인쇄 할 때, 즉 빈 줄을 인쇄 할 때 내가 삭제했던 요소). – user86895

+0

ProsArray (\ @ Array)와 같이 호출 할 수 있다고 생각합니다. – jkeuhlen

답변

2

배열을 inplace에서 작동하려면 전달한 참조에 대해 작업해야합니다. 또는 반환 값을 저장해야합니다.

use strict; 
use warnings; 
use Data::Printer; 

my @array_inplace = (1 .. 5); 
my @array_return = (1 .. 5); 

for (1 .. 3) { 
    ProsArrayInplace(\@array_inplace); 
    @array_return = ProsArrayRet(\@array_return); # replace array with retval 
} 

sub ProsArrayInplace { 
    my ($array) = @_; 
    #do stuff to @$Array (e.g., remove or add elements... 
    push(@$array,10); # modify in place 
} 

sub ProsArrayRet { 
    my @array = @{$_[0]}; #dereference 
    #do stuff to @$Array (e.g., remove or add elements... 
    push(@array,10); #modify array scoped to sub 
    return @array; #return modified array 
} 

p(@array_inplace); 
p(@array_return); 

결과 :

[ 
    [0] 1, 
    [1] 2, 
    [2] 3, 
    [3] 4, 
    [4] 5, 
    [5] 10, 
    [6] 10, 
    [7] 10 
] 
[ 
    [0] 1, 
    [1] 2, 
    [2] 3, 
    [3] 4, 
    [4] 5, 
    [5] 10, 
    [6] 10, 
    [7] 10 
] 
+0

또는, my 배열 = @ {$ _ [0]을 제거하여 코드에서 전역 배열을 조작 할 수 있습니다. ]};와'return (@Array);를 호출하고 전역'@ Array'를 직접 조작합니다. 장소의 글로벌 가치는 예기치 않은 크기 효과가있는 문제로 이어지는 경향이 있다는 것을 명심하십시오. 가변 범위를 가능한 한 엄격하게 유지하는 것이 좋습니다. 일반적으로 글로벌 스코핑 디자인보다 두 가지 양식을 사용하는 것이 좋습니다. – Oesor

2

:

당신이 직면하고있는 문제는 재귀를하고있는 방식으로 인해 발생 생각

.

@Array = ProsArray(\@Array); 

에서

당신은 때마다 객체 @array 원본과 동일한 참조를 전달합니다. "\"제거하고 코드를 다시 실행하십시오.