2011-05-13 3 views
5

Perl이 함수에 대한 참조로 인수를 전달할 수있는 능력이 있는지 궁금합니다. 파이썬도 루비도 그런 특징을 가지고 있지 않다는 것을 알고 있습니다.왜 펄은 참조로 인수를 허용합니까?

+2

암시 적 또는 명시 적으로 참조 전달 중이십니까? 아마도 당신이 의미하는 것을 보여 줄 수 있습니다. – TLP

+0

왜 인수를 참조로 전달할 수있는 기능을 생략하고 싶습니까? –

+0

별칭을 포함하고있는'@ _ '은 Perl 3 일 전까지 사람들이 의존했던 우연한 기능이었습니다. p5p 아카이브와 git repo의 검색은 비어 있지만 @tchrist 또는 @merlyn은 대답을 알 수 있습니다. –

답변

7

한 가지를 구별하는 것이 유용합니다.

(1) 서브 루틴 에 대한 인수를으로 전달. 언어가 서브 루틴에 대한 모든 인수를 미분 값 목록으로 전달하기 때문에 Perl에서 유용합니다. 데이터 구조를 참조로 전달할 수없는 경우 함수의 설계자는 예를 들어 두 개의 목록을 사용하여 목록을 분리 된 상태로 유지할 수 없습니다. 또한 데이터 구조가 큰 경우 참조로 전달하면 성능이 향상됩니다. 파이썬과 루비는 다르게 설계 되었기 때문에

process_two_lists(@x, @y); # Can't distinguish the lists. 
process_two_lists(\@x, \@y); # Can. 

, 그들은 인수가 전달되는 방법이 구별을 필요로하지 않습니다. Python이나 Ruby의 비슷한 메소드는 두 개의 별개의 인수 (리스트 xy을 나타내는 두 개의 객체)를받습니다.

(2)의 동작은 펄 @_ 호출자이인지 서브 루틴은 데이터를 수정하는 것을 허용 할 별명 전달 인자에 역할있다.

sub add_ten_to_me { 
    $_[0] += 10; 
} 

my $x = 1; 
add_ten_to_me($x); 
say $x;   # 11 Amazing! 

파이썬과 루비는 이러한 유형의 작업을 수행 할 수 있습니다. 그러나, 몇 가지 자격이 있습니다. 파이썬은 사이에서 변경할 수 없으며 개체로 구분합니다. Python 메소드 (예 :리스트)에 변경 가능한 것을 전달하면 메소드는 데이터 구조를 수정할 수 있습니다. 따라서 process_two_lists의 Python 버전은 xy을 모두 수정할 수 있습니다. 그러나, 불변 객체 (정수 등)를받는 함수는 그렇지 않습니다. 따라서 add_ten_to_me의 직접 파이썬 아날로그는 작동하지 않습니다. [Ruby에 관해서도 비슷한 점이 있다고 생각합니다. 그러나 지금은 세부 사항에 익숙하지 않습니다.]

+1

# 2는 사람들이 보통 "pass-by-reference"라고 부르는 것입니다. # 1은 참조 전달 – user102008

6

참조를 통해 인수를 전달하면 성능이 크게 향상 될 수 있습니다.

4

Perl이 선택 사항을 제공합니다. TIMTOWTDI 아이디어의 일부라고 생각합니다. 유연한 방법이므로 필요한 것을 할 수 있습니다. 인수에 $_[0]으로 액세스하면 동일한 객체입니다. 그것을 옮기거나 어휘로 복사한다면 그것은 가치있는 것입니다.

이렇게 생각하면됩니다. 대부분의 코드는 가치에 따라 다르지만 필요한 경우 참조가 있습니다.

관련 문제