7

Perl では、次のように変数に別の変数への参照を割り当てることができます。

my @array = (1..10);
my $ref = \@array;

そして、それは参照であるため、次のようなことを行うことができ、両方の変数が影響を受けます:

push @array, 11;
push @$ref, 12;

1..12両方の変数が同じスペースを指しているため、両方の変数に が含まれます。

さて、同じことを行う方法があるかどうか知りたいのですが、参照から始めて、後でその参照をプレーン変数に割り当てます。例えば:

my $ref = [1..12];
my @array = # something here that makes @array point to the same space $ref contains

私はそれを次のように割り当てることができることを知っています:

my @array = @$ref;

しかし、それはコピーです。$ref または @array を変更すると、それらは独立した変更になります。

@array が $ref と同じ変数を指すようにする方法はありますか?

4

2 に答える 2

7

4 つの方法:

  • our @array; local *array = $ref;
  • \my @array = $ref;(5.22 に追加された実験的機能)
  • use Data::Alias; alias my @array = @$ref;
  • 魔法を使う(例tie my @array, 'Tie::StdArrayX', $ref;

しかしもちろん、賢明なアプローチは行うことです

my $array = $ref;

@$arrayの代わりに使用し@arrayます。



前述の Tie::StdArrayX:

package Tie::StdArrayX;
use Tie::Array qw( );
our @ISA = 'Tie::StdArray';
sub TIEARRAY { bless $_[1] || [], $_[0] }
于 2013-04-06T12:09:22.347 に答える
5

これは、配列がパッケージ変数である場合に、型グロブを使用して実行できます。

my $foo = [7,8,9];
our @bar;
*bar = $foo;
$foo->[1] = 3;
print @bar;     # "739"

ただし、レキシカル変数 (つまりmy @bar) は型グロブで代入できません。おそらく、 を中心に構築されたレキシカルソリューションまたは回避策がありPadWalkerます。

于 2013-04-06T05:27:06.473 に答える