2017-08-08 13 views
6

私はかなり新しいPerlで、最近次のコードを作成しました。私はそれを広範囲にテストし、望ましい結果を返します。しかし、私は、Perlの経験が豊富な人がその使い勝手についてアドバイスできるかどうかという疑問がありました。Perlで変数を宣言する

基本的に、forループ内に 'my'キーワードを持つ配列変数を宣言しました。次に、前述のforループの前に宣言されている別の配列変数で、この宣言された配列変数のアドレスを使用します。

my @Array_of_ALL_Vals; 
for my $iloop (0 .. 10){ 
    my @Array_Vals; 
    . 
    Code in here to populate @Array_of_Vals 
    . 
    push @Array_of_ALL_Vals,\@Array_Vals; 
} 

@Array_Vals変数は、通常、毎回異なるサイズです。さらに、ループ内で定義された配列@Array_Valsは、コード内の他の場所では使用されず、forループに対してローカルです。

私の関心事は、forループ内の配列の宣言です。変数の名前は同じですが、ループの繰り返しごとに異なるメモリアドレスに割り当てられると仮定しています。これは正しいです?

forループ内の配列名にインクリメンタを追加して、名前が毎回異なるようにすることを考えました(@ Array_Vals1、@ Array_Vals2、...)。そして、これらの値を@Array_of_ALL_Vals配列にプッシュし、最終的な配列の値が上書きされないようにすることができます。しかし、いくつかの検索を行った後、私はそのようなメソッドが(変数名を含む変数)が推奨されていないことがわかりました。

私は、ループの繰り返しごとに同じ配列名を使用し、この配列のアドレスを新しい配列(@Array_of_ALL_Vals)に付加する方法が有効であると思いますか?または、ループ配列(@Array_Vals)がすべての反復処理が実行された後に、配列@Array_of_ALL_Vals(@Array_Vals配列のアドレスを含む)の有効性を上書きし続けることはありますか?

Gauss76

+0

答えの代わりに、これをループの後に 'print \ @Array_Vals、\ n"; 'と@ print_ $ _ \ n" for @Array_of_ALL_Vals; 'に入れてください。 –

+2

@Сухой27のコメントにご注意ください - これは良い質問ですが、あなた自身で把握することができます。 – zdim

+0

ありがとう...私はそれをテストします。 – gauss76

答えて

6

任意のコメント

多くのおかげで、あなたのループに入るたびに、@Array_Valsと呼ばれる新しい変数を取得します。これらの変数のそれぞれは、メモリの異なる部分に存在するため、異なる参照を持つことになります。これを確認するには、ループ内の配列(print \@Array_Vals)への参照を出力します。

これで新しい配列変数が作成されました。そして、その配列への参照を取得し、別の配列に参照を格納します。これでループの繰り返しが終了し、@Array_Valsは範囲外になり、存在しなくなります。または、むしろ変数の名前が存在しなくなります。 @Array_Valsへの参照を@Array_of_All_Valsに保存したとき、Perlは内部的にこの参照が別の場所に保存されていたことに注意しました(「参照カウントは増分されました」)。参照カウントがゼロではない間に、Perlは古い@Array_Vals配列を格納するために使用されたメモリを解放しません。

@Array_of_All_Vals配列が範囲外になると、Perlはその要素に格納されているすべての参照の参照カウントを減らします。古い@Array_Vals配列の参照カウントはゼロになり、将来のある時点でPerlのガベージコレクションはそのメモリを自由に再利用できます。

あなたが開発したメカニズムは正常に動作することが保証されています。実際、このような状況に対しては、推奨されるアプローチです。

+0

素晴らしい!多くのありがとうDave、非常にエレガントに説明! – gauss76