2014-09-09 2 views
4

필자는 perl 참조를 배우고 있는데, 필자는 배열이나 배열에 대한 참조의 유용성을 이해합니다. 그러나 어떤 시나리오에서 스칼라 값에 대한 참조가 유용 할 수 있는지 생각해보십시오. perl에서 스칼라에 대한 참조를 사용합니까?

my $x = 1; 
my $sr = \$x; 

경우 대신 $x의 직접 사용의, $$sr를 사용하는 것이 유용 할 수 있습니까?

예를 들어 심층적 인 해시 코드 구조를 탐색 할 때 주어진 노드가 hashref 또는 arrayref인데도 스칼라에 대한 참조를 반환하는 대신 직접 스칼라 값을 반환하면 참조를 반환하는 것이 일반적인 방법이 아닙니까?

스칼라의 값을 반환하는 대신 스칼라에 대한 참조를 사용하거나 반환하는 함수 나 모듈이 있습니까?

+1

스칼라 참조를 사용하는 이유는 무엇입니까?일반적으로 나는 항상 배열이나 해시 맵 또는 기본 유형과 결합 된 좀 더 복잡한 구조체에 대한 참조를 사용합니다. 나는 왜 당신이 참고 문헌을 사용해야하는지 생각하고 있다고 생각한다. 그렇습니다. 컴파일러에서 가치 복사의 가격을 낮추기 위해 C++와 같은 다른 프로그램 언어에서도 볼 수 있습니다. 비록 당신이 스칼라의 참조를 사용할 수는 있지만 런타임 레벨에서 컴파일러에 대한 승진은 거의 없다. 대부분의 사람들이 사용하지 않는 것을 신경 쓰지 마라. – DarkHorse

+0

슬프게도, "의견을 기반으로" "최선의 anser"를 선택할 수없는 "잘못된 질문"을 묻는 데있어서 슬프게도, 나 자신을 발견했습니다. 모두 좋습니다. 이렇게 돼서 미안하다. – kobame

+0

좋은 질문입니다. 다른 사람의 대답은 나보다 낫다. 나는 정말로 다른 언어들 사이에 공통점이 너무 많다고 생각합니다. 따라서 본질적으로 참조는 C에서 포인터 또는 C++에서 참조와 동일한 의미를 가지며 펄에서는 특별하지 않습니다. 그건 내 의견이야. – DarkHorse

답변

3

서브 루틴에서 전달되는 값을 직접 수정하려는 경우.

sub increment_this { 
    my ($inc_ref) = @_; 
    ${$inc_ref}++; 
} 

내가 알고있는 사소한 사건의 비트, 그러나 아마 더 관련이 변수 또는 $_에서 편지를 후행 제거합니다 chomp 같은 사례가 될 것입니다.

생각해 보면 - $_은 종종 효과적으로 참조됩니다. 이 할 경우

my @array = qw (1 2 3); 
foreach (@array) { 
    $_++; 
} 

print @array; 

배열의 내용을 수정 한 $_ 수정.

+0

'$ _'는 별칭이므로 OP에있어서 가장 행복한 예제는 아닙니다. –

+0

예! 'increment_this'는 좋은 예입니다. 그건 내 마음에 오지 않습니다. 고맙습니다. – kobame

+2

하지만'$ {$ inc_ref} ++;'.. "또는"no "여야합니까? – kobame

2

당신은 객체 사이의 스칼라 공유하려는 경우 :

my $v = 1; 
my %h1 = (a=>\$v); 
my %h2 = (b=>\$v); 
$v++; 
print ${$h1{a}}, "\n"; 
print ${$h2{b}}, "\n"; 

인쇄 : 당신이 하위에 큰 문자열을 통과해야 할 때

2 
2 
+1

내부에있는 물건들,하지만 Moose 이전에 있었던 것, http://perltraining.com.au/tips/2006-03-31.html –

+0

@mpapec 이해하기 위해 노력하는 동안 @mpapec은 몇 시간의 공포에 대비해 주셔서 감사합니다. 안쪽 밖으로 "개체. :) :) :) – kobame

+1

나는 오브젝트 내부를 생각하는 것이 게으른 코더가 오브젝트 속성을 직접 조작하는 것을 방해하는 방법으로 "Perl Best Practice"에서 권장되는 것으로 생각합니다. 그것은 더 이상 사용하지 않습니다. 왜냐하면 당신이 충분히 작은 규모로 그것을하고 있다면, 그것은 무의미합니다. 그리고 당신이 충분히 큰 규모로 그것을하고 있다면, 그것을하는 더 좋은 방법이 있습니다. – Sobrique

1

그것은 유용합니다, 그리고하지 않습니다 그 (것)들의 사본을 빨리하고 기억을 낭비하지 말라 :

sub my_sub { 
    my $str = shift; #makes a copy of a reference => cheaper 
    #do something with $$str 
} 

#... 
$x = ' ... large string ...'; 
my_sub(\$x); 
+0

대신'$ _ [0]'을 사용할 수있을 때 유용하지 않습니다. 유용성보다 혼란 스럽습니다. – TLP

+0

@TLP API가 실제로 그러한 참조로 할 수있는 것을 암시하기 때문에 나는 이것에 대해 확신하지 못한다. –

+0

사람들이 실수로 원래 변수를 변경하는 것을 피할 수 있습니까? 그들은'my $ new = mysub ($ old)'를하려고 시도하는 것처럼? – TLP

3

난 진짜 대답은 당신의 질문 자체에 거짓말 같아요 : 스칼라에 대한 참조는 굉장히 유용하지 않습니다, 그리고 당신은 아마 그들이 코드를 작성할 때 존재한다는 것을 무시할 수 있습니다. 주된 유용성 as hinted at by perreal은 동일한 메모리 위치 : 객체간에 변수 공유를 가리킬 수 있다는 것입니다.

그러나 호기심과 학업 목적을 위해, perreal과 Sobrique가 남긴 좋은 예 외에도 다소 모호한 것이 하나 있습니다. 당신은 변수에 인쇄 할 파일 핸들을 열 수 있습니다

파일 핸들 주위에 전달 :

use strict; 
use warnings; 
use Data::Dumper; 

my $string; 
open my $fh, ">", \$string or die $!; 
print $fh "Inside the string"; 

print Dumper $string; 
# prints $VAR1 = 'Inside the string'; 
+2

+1, 참조는이 기능보다 오래되었으며'\ my $ string'은 아마도 더 간결합니다. 아마도 –

+0

@mpapec. 필자는 항상 변수보다는 함수에 대한 참조를 넣는 것이 이상하다고 생각합니다. – TLP

0

@TLP는 또 다른 예를 묻는 메시지가 파일 핸들을 언급했다. 파일을 조작하는 좋은 방법은 네임 스페이스 오염을 피하기 위해 어휘 파일 핸들을 사용하는 것입니다.

sub write_header { 
    my ($fh_ref) = @_; 
    print ${$fh_ref} "This is a header\n"; 
} 

open (my $output, ">", "output_filename"); 
write_header (\$output); 
write_content (\$output); 
write_footer (\$output); 
close ($output); 
+0

그래도 파일 핸들을 직접 사용할 수 있습니다. – TLP

+0

typeglob에 대한 참조는 의미가 있지만 어휘 파일 핸들에는 해당되지 않을 수 있습니다. –

관련 문제