2017-04-06 2 views
0

나를 위해 Perl 참조는 파악하기가 어렵습니다. 객체 메소드를 사용하는 객체 지향 스크립트와 같은 것을 읽을 때 객체를 참조로 사용하는 것을 본 적이 없다. 대형 객체의 경우에도 서브 루틴 (메소드)에 복사되는 대신 참조로 사용하면 도움이됩니다. 장면 뒤에Perl 메서드 및 참조로 전달

$p->a_method($value); 

는, 펄이

a_method($p, $value); 

를 실행하지만 $p 거대한 물체가있는 경우, 당신은로 전달 싶지 않을 것이다 :

PerlMaven는 말한다 참고?

a_method(\$p, $value) 

나는 객체가 큰 경우 참조로 전달하면 속도가 크게 높아질 수 있다는 것을 항상 알고 있습니다. OO에서는 대용량 객체 (예 : 거대한 XML::Twig)로 작업하고있을 가능성이 큽니다. 그렇다면 실제로 서브 루틴을 참조로 전달할 때 이러한 객체에 대한 메서드를 어떻게 호출할까요?

+1

NIT :'$ P-> 그 인용문에서 알 수 있듯이 a_method ($ 값)'반드시 현재 패키지에서 하위를 호출하지 않습니다. '$ p-> a_method ($ value)'는'my $ sub = $ p-> can ('a_method') -> ($ p, $ value)에 더 가깝다 ' – ikegami

+2

'$ p'는 참조 포인터는 당신이 산술을 할 수 없다), 그리고 참조는 (모든 인수가 Perl에서 참조로 전달되기 때문에) 참조로 전달된다. 그것들 둘다 (독립적으로) 객체의 크기를 메소드 호출과 무관하게 만든다. 그리고 전자는'my $ self = shift; '와는 무관 한 객체의 크기를 만든다. – ikegami

답변

9

$p에는 이미 개체에 대한 참조가 포함되어 있습니다. 메소드 호출에는 객체에 대한 참조가 필요하며이 참조는 하위로 전달됩니다. 그래서, $ self는 항상 참조입니다. perlobjbless을 참조하십시오.

#! /usr/bin/perl 
use strict; 
use warnings; 
use feature 'say'; 

{ package Class; 

    sub new { bless {}, __PACKAGE__ } 
    sub inf { ref shift } 
} 

my $o = 'Class'->new; 
say $o->inf ? 'reference' : 'not a reference'; 

출력 :

reference 
+0

고마워, 나는 이것에 대해 아무것도 찾을 수 없습니다. PerlMaven의 예는 나에게도 더 혼란 스럽습니다. 다시 쓰는 방법이 가치에 의해 전달 된 것처럼 보이기 때문입니다. –

+0

글쎄, 그건 단지 "참조"가 값이기 때문입니다. 포인터와 같은 비트. (전적으로는 아니지만). – Sobrique

+0

@Bram Vanroy, Re "* 값으로 전달 된 것 같습니다."* 모든 인수는 Perl에서 참조로 전달되지만 대개 (my ($ arg) = @_;) . – ikegami