2012-01-23 14 views
3

巨大な文字列をサブルートに転送することですが、転送時のコピーを避けます。非常に大きな文字列を指している$refという参照があるとします。また、f($)サブルーチンが1つの引数を受け入れるようにしましょう。 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に転送します。

私はfで実際にはCPANモジュールのメソッドなので、私はコントロールがありません。

タスクを解決することは可能ですか? 事前に感謝します。

+0

'$ ref'が参照の場合は、' f($ ref) 'を呼び出すだけでいいですか?リストについては、 'f($ _)for @ a'を使うことができます。 – choroba

+1

@indexless:これに 'XML :: LibXML'と関係がある場合は、そう言います。 – Zaid

+0

@Zaid DBIモジュールには何かがあります。 - > execute()メソッドに値のリストを渡したいが、そのリストには挿入する値への参照が入っている。 – indexless

答えて

3

はい、「マップ」は、常にコピーする方法で少し迷惑になる可能性があります。

Data::Alias::derefを使用すると、リスト全体からすべての要素をコピーせずに、配列に逆参照できます。 @aを想定し

は、参照の配列で、あなたはそれらの参照を間接参照した結果である引数リストを持つ関数f()を呼びたい、あなたは

use Data::Alias qw(alias deref); 

f(deref @a); 

Data::Aliasとして存在していることに注意を行うことができます(例えば)Ubuntu(libdata-alias-perl)用のディストリビューションモジュールですので、CPANを直接使うことができなくても使用することができます)。

実際、あなたが多くの大きな文字列オブジェクトとコピーを最小限に抑えることが懸念されている場合、Data :: Alias more extens瞬時に実際に、プログラミングアーゼルでData :: Aliasを使用すると、配列にデータをまったく格納する必要がないことがあります。

あなたのデータは一度に1つ(巨大な)値になり、それらの値を配列に入れたいとします。あなたが現在

push @a, \$value; 

を行う可能性があり、一方、あなたはあなたが一つの大きな配列にしたい(巨大な要素の)二つのリストを持っている場合、あなたはこの

を行うことができます

alias push @a, $value; 

にそれを変えることができます

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

ありがとう!偉大な答えは、パッケージは非常にいいようだ、私はそれらを学ぶでしょう。 (私はUbuntuではなくMac OS Xの下に座っていますが、Data :: AliasはMacPortsでも提供されるので、CPANからインストールする必要はありません)。 – indexless

+0

Data :: Aliasは、私が探していた 'deref'関数を提供しています。ありがとうございました。 – indexless

+0

@indexless:よろしくお願いします。 Data :: Alias :: derefを使用する答えを更新しました。 – zgpmax

関連する問題