web-dev-qa-db-ja.com

配列参照にプッシュ

Perlで配列参照をPushすることは可能ですか?グーグルは私が最初に配列を参照することを提案しましたが、これは実際には機能しません。参照された配列ではなく、参照された配列にプッシュします。

例えば、

my @a = ();

my $a_ref = [@a];

Push(@$a_ref,"hello");

print $a[0];

@aは更新されず、配列がまだ空であるため、このコードは失敗します

(私はまだPerlリファレンスを学んでいるので、これは信じられないほど簡単な質問かもしれません。そうであれば申し訳ありません)

33
Mike

変数名ではなく、メモリアドレスの観点から考えると役立つ場合があります。

my @a = ();       # Set aside memory address 123 for a list.

my $a_ref = [@a]; # Square brackets set aside memory address 456.
                  # @a COPIES the stuff from address 123 to 456.

Push(@$a_ref,"hello"); # Push a string into address 456.

print $a[0]; # Print address 123.

文字列が別のメモリ位置に移動しました。

代わりに、$a_ref変数をリスト@aのメモリ位置にポイントします。 Pushはメモリロケーション123に影響します。@aはメモリロケーション123も参照するため、その値も変化します。

my $a_ref = \@a;       # Point $a_ref to address 123. 
Push(@$a_ref,"hello"); # Push a string into address 123.
print $a[0];           # Print address 123.
47

遅延せずに配列参照に直接プッシュできます。

my $arrayRef = [];
Push $arrayRef, "one";
Push $arrayRef, "two";
print @$arrayRef;

アウトプット

onetwo

ドキュメント: http://perldoc.Perl.org/functions/Push.html

Perl 5.14以降、PushはスカラーEXPRを取ることができます。これは、blessされていない配列への参照を保持する必要があります。

5.14より前では、最初に配列参照を逆参照する必要があります。

Push @$arrayRef, "item";

編集:配列のrefへの直接プッシュは、最近のPerlリリース(5.24?)で非推奨になりました。このため、コードの互換性を高めるためにプッシュする前に、常に@ {$ arrayRef}を逆参照する方が安全です。

7
Despertar

$a$a_refではありません($asort{}に与えられる最初の比較変数であり、$a[0]@aの0番目の要素です配列)。カスタムソートサブルーチンの外で$aまたは$bを使用しないでください。また、@aおよび@b配列も避けるべきです(多くの優れた機能があります)。選択肢)...

あなたがしていることは、匿名配列$a_refに割り当ててから、その配列に"hello"をプッシュすることですが、@a配列の最初の要素を出力します。

3
Evan Carroll

はい、可能です。これは私にとってはうまくいきます。

my @a = (); 
my $aref = \@a; # creates a reference to the array a

Push(@$aref, "somevalue"); # dereference $aref and Push somevalue in it

print $a[0]; # print the just pushed value, again @$aref[0] should also work

すでに述べたように、$aref = [@a]は、への参照をコピーして作成しません

1
neal aise