4

さて、配列への参照を作成するのは簡単です...

my @a;
my $b=\@a;
#can now reference the same list of scalars from either @$b or @a

しかし、どうすればこれを逆に行うことができますか?例えば:

my $a=[1..4];
my @b;
#some magic happens here and now @b is an alias for @$a
@b=(6..10);
print "@$a\n";  #should print "6 7 8 9 10"

私はこれがtypeglobsを通して起こると思います、しかしそれらはただ私を逃れます。アイデア?

また、配列だけでなくハッシュに対しても同じことを行うと便利です。

編集:これは機能しているように見えますが、anon配列要素を「エイリアス」にコピーしてから、それ自体を配列に再ポイントするだけなので、少し厄介です。

my @b=@$a;
$a=\@b;

より良いアイデアはありますか?

4

4 に答える 4

8

3 つの方法:

  1. リエイリアス。

    5.22 は、まさにあなたが望むことを行う実験的な機能を追加しました。

    use experimental qw( refaliasing );
    \my @B = $A;
    

    5.26 では、次のことを可能にする 2 つ目の実験的機能が追加されました。

    use experimental qw( refaliasing declared_refs );
    my \@B = $A;
    

    これらの機能は実験的な機能であるため、いつでも変更および削除される可能性があることに注意してください。

  2. グロブのエイリアシング

    Perl は「タイプ glob」または略して「glob」と呼び、そのシンボル テーブル エントリ データ構造を呼び出します。このデータ構造のエントリを参照に設定して、その参照に名前を付けることができます。

    local our @B;
    *B = $A;      # Sets the array slot of "B", @B.
    

    パッケージ変数を使用する必要があるため、変数はグローバルに表示されることに注意してください。

  3. データ::エイリアス

    alias my @B = @$A;
    
于 2012-12-28T14:59:42.013 に答える
6

perl プログラムのすべての変数は名前空間に格納されます。名前空間には次の 2 種類があります。

  1. シンボル テーブル。これは、グローバル変数の記録を格納するグローバル ハッシュです。
  2. レキシカルスコープ。保存されるのは匿名の一時メモリであり、特定のシンボルテーブルではありませんが、プログラムのブロックに関連付けられています。それらは、そのプログラムブロックでのみ見ることができる変数を保存します。

型グロブは、シンボル テーブルのレコード (変数、配列など) を定義するために使用されますが、レキシカル スコープでは使用されません。したがって、コードのこの部分を使用する場合:

my @b;
*b = $a;

あなたはそれを取得します:

Name "main::b" used only once:

これは、レコード main::b が Symbol テーブルで定義されていないことを示していますが、修飾子 " our " を使用して定義できます。したがって、そう書くと:

our @b;
*b = $a;

*b はシンボル テーブルに格納され、演算子 * 型グロブを使用できるため、有用な結果を得ることができます。

于 2012-12-28T15:32:41.483 に答える
3

私はそれを手に入れたと思います...

my $a=[1..4];
our @b;
*b=$a;
print "@b\n";
@b=(6..10);
print "@$a\n";

プリント:

1 2 3 4
6 7 8 9 10

「私たちの」は私にとってはまだ少し謎です.

于 2012-12-28T14:43:33.773 に答える
0

$a と @a は同じものではありません。最初に割り当てた $a は、無名配列への参照です。配列である (参照ではない) @a とは何の関係もありません。

$b = \@a # $b は @a への参照を保持しますが、$a への参照は保持しません。

$a、@a、%a はすべて異なる変数です。だから、あなたが持っているなら

私の@a = (1,2,3,4);

そして、あなたは宣言します

私の $a;

$a は @a への参照を保持していません。

変数は、そのタイプによってシンボル テーブルに保持されます。スカラー、ハッシュ、配列など。そうすれば、$a、@a、%a、&a ... を使用でき、互いに競合しません。

ポイントは、

#some magic happens here and now @b is an alias for @$a

起こりません。$a が格納されている場所とは異なる @a が格納されているメモリ内の領域をまだ指しています。

于 2012-12-28T13:48:53.947 に答える