2011-04-14 2 views
2

어떻게 로컬 변수 배열 (또는 그 변수에 대한 변수)의 값을 perl로 리턴합니까? 예를 들어. 배열에 대한 참조를 반환해야합니다. 그것도 잘 작동하지 않는 것 같습니다.Perl 프로그래밍 및 리턴 값

sub routine 
{ 
my @array = ("foo", "bar"); 
return @array; 
} 

하지만 이것은 작동하지 않습니다. perl에서 지역 변수의 값을 어떻게 반환합니까?

내 두 번째 관련된 질문은 배열로 중첩 된 배열에 액세스하는 방법입니다. 예를 들어. 이전 질문은이 솔루션에 대한 필요성을 창출합니다.

@nestedArray = ("hello", "there"); 
@array = ("the", \@nestedArray); 

($variable1, $variable2) = values @array; 

내가

($variable3, $variable4) values $$variable2; ## This doesn't seem to work? 

시도한 것입니다 : - 두 번째를 들어/

+6

첫 번째 예가 어떻게 작동하지 않습니까?당신이 기대하는 바가 뭐니? –

+0

다르게 입력해야합니다 :-( – rubixibuc

답변

3

을 두 번째 질문에, 당신은 참조의 이해를 취소 perlreftut을 읽어야합니다.

또한 keysvalues은 기술적으로 배열에서 작동하지만 실제로는 해당 배열을 사용하지 않습니다. 빨간 청어 야.

+0

배열의 각 값을 스칼라 목록으로 추출하는 올바른 방법은 무엇입니까? – rubixibuc

+3

올바른지 배열의 각 값을 스칼라 목록으로 추출하는 방법은 간단하다. ($ variable1, $ variable2) = @array; – tadmc

+0

감사합니다 .--), 참고 자료를 읽으면서 매우 도움이되었습니다. 잘. – rubixibuc

0

이 작동 :

($variable3, $variable4) = @$variable2; 

첫 번째 예처럼 작동하는 것 같다 너는 그것을 가지고있다.

0

일반적으로 비 스칼라 변수 또는 스칼라 값에 대한 참조를 직접 반환합니다. 다음

return $var 
or 
return \@var 
or 
return \%var 

그 역 참조 % $으로의 VAR 또는 @ $으로의 VAR이나 화살 표기

$의 VAR 등 -> [0] 또는 $ VAR -> {hash_key}

+0

배열에있는 목록을 반환하지 않는 이유는 무엇입니까? – tchrist

+0

아마도 목록으로의 변환이 배열을 반환하는 것과 같지 않을 수도 있습니다 만, 확실하지는 않지만 perl의 일반적인 관용구입니다 프로그래밍 나는 꽤 익숙해졌습니다. –

+0

목록 컨텍스트에서 동일합니다. 스칼라 컨텍스트에서 다릅니다. – tchrist

2
sub routine { 
    my @array = ("foo", "bar"); 
    return @array; 
} 

print join "\n", routine(); 

위 참으로 목록을 반환합니다.

@nested_array = ("hello", "there"); 
@array = ("the", \@nested_array); 

print join "\n", ($array[0], @{ $array[1] }); 

여기서, @array의 첫 번째 요소는 the이고 두 번째 요소는 어레이의 기준이다. 따라서 두 번째 요소를 배열로 역 참조해야합니다.

그러나, 편의를 위해, 당신은 목록에 두 번째 배열을 평평하게 수 :

@array = ("the", @nested_array); 
print join "\n", @array; 
0

처음에는 옳은 일을했습니다. 하지만 당신이 스칼라 맥락에서 함수를 호출, 그래서 당신은 목록/배열에있는 요소의 번호를 가지고 생각합니다.

sub routine 
{ 
    my @array = ("foo", "bar"); 
    return @array; 
} 

my $a = routine(); # a will be **2** instead of an array ("foo", "bar") 
my @a = routine(); # a will be an array ("foo", "bar") 

정말로 배열을 반환해야하고 하위가 제대로 호출되었는지 확인하고자하는 경우. wantarray() 기능을 사용할 수 있습니다.

sub routine 
{ 
    my @array = ("foo", "bar"); 

    return @array if wantarray; 

    die "Wrong invoking context"; 
} 

두 번째로는 푸시를 사용할 수 있습니다.

@nestedArray = ("hello", "there"); 
@narray = ("the", "world"); 

push @narray, @nestedArray; # @narray is ("the", "world", "hello", "there")