2016-05-23 9 views
2

変数$aを定義します。匿名コンテナ

my $a = 123; 

$aに関連付けられているsigilless変数定義:

my \b = $a; 

を我々はb経由$aの値を変更することができます。

b = 234; 

say $a; 

ことをを表示する必要があります10。

b$aに関連付けられたコンテナに設定されているため、私の理解はこれになります。

匿名コンテナを定義する方法はありますか?私。このような何か:b以来

my \b = container(123); 

は、コンテナに関連付けられているが、割り当ては最初の例のように動作します:

b = 234; 

答えて

3

$匿名Scalarコンテナ(ETA:state付き)です

ATTENTION !!この回答の私の "解決策"は、この回答の下のコメントに@BradGilbertとの私の交換で明らかになったように、壊れた思考を反映しています。私はいつかこの答えを削除するかもしれませんが、今のところ私はちょうど状態修飾子/リンクを上記のタイトルとこのうまくいきなり声を出して十分な段落に追加しています。

my \a = $ = 123; 
say a;      # 123 

a = 100; 
a--; 
say a;      # 99 

my \list = (1,2,3);  # assign to anon List container 
say list >>+>> a;   # (100,101,102) 

my \array = [1,2,3];  # assign to anon Array container 
array[2] = 42; 
say array;     # [1 2 42] 

a = array[1];    # assign to anon Scalar within Array 
a = "yep"; 
say array;     # [1 yep 42] 

my \hash = {:a, :b, :c}; # assign to anon Hash container 
say hash<b>;    # True 

# etc. 
+0

素晴らしいです、あなたはraiph感謝! – dharmatech

+1

@dharmatech '$'だけでは 'state $'と同じであることに注意してください。特に、これがサブルーチン内にある場合は、 'my $'が必要です。 'my \ a = my $ = 123;' –

+0

@BradGilbert:意味的な影響はありますか? 'my \ a = $ = 123'がサブにある場合、コンパイラは最初にその行に遭遇したときに' a'変数と匿名コンテナの両方を作成します。サブの終わりでは 'a'変数がガベージコレクタにスローされますが、anonコンテナはスローされません。同じ行に再び遭遇した場合(例えば、サブを再び呼び出すなど)、 'a'変数は再生成されますが、' $ 'のアノテーションは再生成されません。割り当てはまだ起こり、 'a'は' 123'を得ます。 'my \ a = my $ = 123'はメモリの使用と速度に影響を与える' a'変数と同時に '$ $ 'が捨てられることを意味します。 – raiph

0

これがないbコンテナを割り当てるための方法ですようですbと同じスコープで別の名前を持っている:

my \b = { my $a = 123; $a; }(); 

b = 234; 

say b; 

ので、そのアプローチと一緒に行く、containerを解除することができます

sub container(\val) is rw { my $var = val; $var; } 

例:

my \b = container(123); 

b = 234; 

say b; 

表示234を次のように罰金。

+2

またははるかに簡単 'サブコンテナ(\ val)でRW {私の$ = valの}' –

+2

あるいは 'サブコンテナは($ cはコピーです)RW {$のC}' – Christoph