この記事では、例を使用して Perl 配列を参照および逆参照する方法を確認します。参照は、別の変数の場所 ( address ) に他なりません。参照は、配列、ハッシュ、または Perl コードのスニペットにすることができます。参照により、Perl コードの実行速度が向上します。
配列への Perl リファレンス
通常、以下に示すように、要素のリストを配列に格納します。
@array = (“one”,”two”,”three”,”four”,”five”);
配列参照を変数に割り当てるには、以下に示すようにバックスラッシュ (\) 演算子を使用します
$array_ref = \@array;
$array_ref 変数を出力しようとすると、次のような結果が得られます。
ARRAY(0x1a2b3c)
以下に示すように、Perl 配列参照をサブルーチンに渡すこともできます。
sub add_numbers { my $array_ref = shift; ..... } @numbers = (11,2,3,45); $array_ref = add_numbers(\@numbers);
上記のコード スニペットでは、サブルーチンが元の配列から要素を取得できるように、配列を逆参照する必要があります。
配列全体を渡すのではなく、参照をサブルーチンに渡すことの利点を次に示します。
- 配列をサブルーチンに渡すと、Perl は配列全体を @_ 変数にコピーします。配列が大きい場合、これは効果的な方法ではありません。
- 元の配列をサブルーチンで変更する場合は、配列の参照を渡す必要があります。
- 参照は、複雑なデータ構造を構築する上で重要な役割を果たします。
以下に示すように、匿名配列の参照をスカラー変数に入れることができます。
$array_ref = [ 11,2,3,45];
注:この記事は、進行中の Perl チュートリアル シリーズの一部です。
Perl 逆参照配列
サブルーチン内では、以下に示すいずれかの方法を使用して逆参照を行うことができます。
参照変数は、以下に示すように逆参照できます。このメソッドを使用すると、配列のすべての要素を取得できます。これは @numbers と同じです。
@{ $array_ref };
配列内の特定の要素を取得するには、次の手順を実行します。このステートメントは、@numbers 配列の最初の要素を提供します。これは $numbers[0]
と同じです$ { $array_ref }[0]
参照を変数に格納する代わりに、Perl 組み込み変数から配列要素に直接アクセスできます。
# Get all the elements of @numbers array. @ { $_[0] } # Get a particular element. This gives the first element of the array. $ { $_[0] } [0]
注: 単純なスカラー変数を逆参照する場合は、以下に示すように中括弧を省略できます。
@$array_ref # same as @{ $array_ref } $$array_ref # same as $ { $array_ref } $_[0] # not a simple scalar variable and this cant be dereferenced,
複数の参照を Perl 配列に格納する
次のサンプル Perl コード スニペットを使用してみましょう。
#Array contains source ip and destination ip @IP = ('192.168.1.10','192.168.1.15'); #Array contains the source port and destination port numbers @PORT = ("5000","5002"); #Sublayers of TCP layer @TCP = ("Q931","H225","H245"); #Common layers are available in a TCP packet. @LAYER = ("ETHERNET","IP",\@TCP); @PKT = ( \@IP, \@PORT, \@LAYER ); #Storing the reference of @PKT array into the scalar variable. $array_ref = \@PKT;
配列参照を理解するために、上記のコード スニペットから、TCP レイヤーの 2 番目のサブレイヤー (「H225」) にアクセスしたいと仮定します。これは、以下で説明するように行うことができます。
まず、LAYER 配列にアクセスする必要があります。これは @LAYER 配列の参照を返します。
$ { $array_ref } [2]
$array_ref は単純なスカラー変数です。したがって、中括弧は省略でき、次のように記述することもできます。
$$array_ref[2]
次に、この参照を介して (@LAYER から) 3 番目の要素/レイヤーにアクセスします。
$ { $ { $array_ref } [2] } [2]
これは、@TCP 配列のアドレスを返します。
最後に、以下に示すように、(@TCP 配列から) TCP レイヤーの 2 番目のサブレイヤーを取得できます。
$ { $ { $ { $array_ref } [2] } [2] } [1]
上記はかなり複雑に見え、コードのモジュール性を低下させます。上記のステートメントを書き直して、次のように見やすくする規定があります。
Perl では、$ { VAR } [ $y] は VAR->[$y] と記述できます。
$ { $array_ref } [2] is same as $array_ref->[2] $ { $ { $array_ref } [2] } [2] is same as $array_ref->[2]->[2] $ { $ { $ { $array_ref } [2] } [2] } [1] is same as $array_ref->[2]->[2]->[1]
ここで、「ドロップアロー」ルールを使用して、次のように書き換えることができます。 「ドロップアロー」ルールに従って、最初のアローを削除することはできません。これははるかに読みやすいです。
$array_ref->[2][2][1]