2012-01-23 3 views
3

거대한 문자열을 하위 루틴으로 전송하는 작업은 이 전송시 복사가 발생하지 않도록 을 피하는 것입니다. 매우 큰 문자열을 가리키는 $ref이라는 참조가 있다고 가정 해보십시오. 또한 f($) 서브 루틴이 단일 인수를 허용하도록합시다. 문제는 f에이 문자열을 아니한 있습니다Perl : 거대한 문자열을 복사하지 않고 서브 루틴으로 전송

f($$ref); # data pointed by $ref is not copied to temporary value here 

정말 내가 하나의 문자열을하지 않은,하지만 그들 중 목록의이 @a에 할당하자

my @a = ($ref_1, $ref_2, $ref_3, ...); 

이제 문제는 해결 될 것

f(map {$$_} @a); 

하지만 map에 의해 는 0에서 사본 각 역 참조 항목을 수행을 복사 한 다음 복사 한 인스턴스를 f으로 전송하십시오.

실제로는 CPAN 모듈의 메소드이기 때문에 f에 대해서는 제어 할 수 없습니다.

작업을 해결할 수 있습니까? 미리 감사드립니다.

+0

'$ ref'가 참조 인 경우'f ($ ref)'를 호출하면 어떨까요? 목록을 보려면'f ($ _) for @ a'를 사용할 수 있습니다. – choroba

+1

@indexless : 이것이'XML :: LibXML'과 관련이 있다면 그렇게 말하십시오. – Zaid

+0

@Zaid DBI 모듈에 뭔가가 있습니다. -> execute() 메서드에 값 목록을 전송하려고하지만 그 목록에는 삽입 할 값에 대한 참조가 들어 있습니다. – indexless

답변

3

예, '지도'는 항상 사본처럼 짜증나게 할 수 있습니다.

Data::Alias::deref을 사용하여 전체 목록의 모든 요소를 ​​복사하지 않고 배열에 역 참조 할 수 있습니다. @a 가정

는 참조의 배열입니다, 당신은, 당신은

use Data::Alias qw(alias deref); 

f(deref @a); 

이 ( Data::Alias가로 존재합니다 할 수있는 이러한 참조를 역 참조의 결과 인자리스트를 만들어서 함수 f()를 호출 할 Ubuntu (libdata-alias-perl)에 대한 배포 모듈이므로 CPAN을 직접 사용할 수없는 경우에도 사용할 수 있어야합니다.

사실, 많은 문자열 객체와 복사 최소화가 걱정되면 Data :: Alias ​​extens를 사용하는 것이 좋습니다. ively. 사실, 프로그래밍 저장소에 Data :: Alias가 있으면 배열에 데이터를 전혀 참조로 저장할 필요가 없다는 것을 알 수 있습니다.

데이터가 한 번에 하나의 (거대한) 값으로오고 그 값을 배열에 넣고 싶다고합시다. 현재

push @a, \$value; 

을 할 수있는 반면에 당신이 (큰 요소) 두 개의 목록이있는 경우 당신은 당신이

을 수행 할 수 있습니다, 당신은 하나 개의 큰 배열로 만들고 싶어 그

alias push @a, $value; 

에 그것을 바꿀 수있다

alias my @one_big_array = (@a, @b); 
+0

감사합니다. 위대한 대답, 그리고 패키지가 아주 좋은 것, 나는 그들을 배울 것입니다. (우분투가 아니라 맥 오에스텐에 앉아있다. 데이터 :: 앨리어스도 맥 포트에서 제공되므로 CPAN에서 설치할 필요가 없다). – indexless

+0

Data :: Alias는 정확히 내가 찾고 있었던'deref' 함수를 제공합니다. 다시 감사합니다. – indexless

+0

@indexless : 전화하세요. Data :: Alias ​​:: deref 사용에 대한 답변을 업데이트했습니다. – zgpmax

관련 문제