配列の初期化と再初期化、そしてリファレンスとデリファレンスについて

備忘録。
制御構文内で配列のリファレンスを再初期化したいときに、思う通りに再初期化できないので、簡単な動作結果を確認する。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Data::Dumper;

# 配列のリファレンス用に変数を宣言する
my $ref_array;
# 初期化のしかたでリファレンス先のデータ型が決まる
$ref_array = 1;
$ref_array = [];
print ref $ref_array, "\n";

# 配列のリファレンス用に変数をデリファレンスして初期化する
@{$ref_array} = qw/1 2 3 4 5 6/;

# デリファレンスした場合の表示内容
print "Dump Reference of Array.\n";
print Dumper($ref_array);

# 配列のリファレンスの表示内容
print "Dump Array.\n";
print Dumper(@{$ref_array});

# デリファレンスして再初期化する
print "Dereference and Initialize Array Again.\n";
@{$ref_array} = qw/A B C D E F G/;
print Dumper(@{$ref_array});

# 配列のリファレンスを再初期化する
print "Initialize Reference of Array Again.\n";
$ref_array = ['a', 'b', 'c', 'd', 'e', 'f'];
print Dumper($ref_array);
print Dumper(@{$ref_array});

実行結果。

ARRAY
Dump Reference of Array.
$VAR1 = [
          '1',
          '2',
          '3',
          '4',
          '5',
          '6'
        ];

Dump Array.
$VAR1 = '1';
$VAR2 = '2';
$VAR3 = '3';
$VAR4 = '4';
$VAR5 = '5';
$VAR6 = '6';

Dereference and Initialize Array Again.
$VAR1 = 'A';
$VAR2 = 'B';
$VAR3 = 'C';
$VAR4 = 'D';
$VAR5 = 'E';
$VAR6 = 'F';
$VAR7 = 'G';

Initialize Reference of Array Again.
$VAR1 = [
          'a',
          'b',
          'c',
          'd',
          'e',
          'f'
        ];

$VAR1 = 'a';
$VAR2 = 'b';
$VAR3 = 'c';
$VAR4 = 'd';
$VAR5 = 'e';
$VAR6 = 'f';

インスタンス変数の配列を初期化・再初期化を行う

クラス化したモジュール内をインスタンス化し、インスタンス変数内の配列を初期化・再初期化する際の備忘録。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Data::Dumper;

{
    package Array::Test;
    use strict;
    use warnings;

    sub new {
        my $class = shift;
        my $self = {};
        return bless $self, $class;
    }

    sub init {
        my $self = shift;
        # $self->{array} = (); では動作しない!!
        $self->{array} = [];
    }

    sub set {
        my ($self, $value) = @_;
        push @{$self->{array}}, $value;
    }
    1;
}

my $at = Array::Test->new;
# 配列として使うインスタンス変数を初期化する
$at->init;

# インスタンス変数の配列に値を代入する
print "Initialize Instance Value as Array.\n";
foreach my $num (0..10) {
    $at->set($num);
}

# 代入終了後の配列の内容
print "Dump Instance Value as Array.\n";
print Dumper(@{$at->{array}});

# インスタンス変数を再初期化する
print "Initialize Instance Value as Array.\n";
$at->init;
print Dumper($at->{array});

# インスタンス変数の配列に値を再代入する
print "Enter Numbers into Instance Value as Array Again.\n";
foreach my $num (11..20) {
    $at->set($num);
}

# 再代入終了後の配列の内容
print "Dump Instance Value as Array.\n";
print Dumper($at->{array});

実行結果。

Initialize Instance Value as Array.
Dump Instance Value as Array.
$VAR1 = 0;
$VAR2 = 1;
$VAR3 = 2;
$VAR4 = 3;
$VAR5 = 4;
$VAR6 = 5;
$VAR7 = 6;
$VAR8 = 7;
$VAR9 = 8;
$VAR10 = 9;
$VAR11 = 10;

Initialize Instance Value as Array.
$VAR1 = [];

Enter Numbers into Instance Value as Array Again.
Dump Instance Value as Array.
$VAR1 = [
          11,
          12,
          13,
          14,
          15,
          16,
          17,
          18,
          19,
          20
        ];