Perlで配列参照をPush
することは可能ですか?グーグルは私が最初に配列を参照することを提案しましたが、これは実際には機能しません。参照された配列ではなく、参照された配列にプッシュします。
例えば、
my @a = ();
my $a_ref = [@a];
Push(@$a_ref,"hello");
print $a[0];
@a
は更新されず、配列がまだ空であるため、このコードは失敗します
(私はまだPerlリファレンスを学んでいるので、これは信じられないほど簡単な質問かもしれません。そうであれば申し訳ありません)
変数名ではなく、メモリアドレスの観点から考えると役立つ場合があります。
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.
遅延せずに配列参照に直接プッシュできます。
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}を逆参照する方が安全です。
$a
は$a_ref
ではありません($a
はsort{}
に与えられる最初の比較変数であり、$a[0]
は@a
の0番目の要素です配列)。カスタムソートサブルーチンの外で$a
または$b
を使用しないでください。また、@a
および@b
配列も避けるべきです(多くの優れた機能があります)。選択肢)...
あなたがしていることは、匿名配列$a_ref
に割り当ててから、その配列に"hello"
をプッシュすることですが、@a
配列の最初の要素を出力します。
はい、可能です。これは私にとってはうまくいきます。
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]
は、への参照をコピーして作成しません