あなたはPerlの初心者であり、すでに参照をヒットしています...
Perlには、次の3つの標準タイプのデータがあります。
- スカラー:これらには、などの単一の値を含めることができます
$foo
。
- 配列:これらには値のリストを含めることができます。配列には順序があり(この値はこの値よりも配列内で早い)、値は配列内の順序(0番目の項目から最後の項目まで)に基づいて参照されます。配列をとして参照し
@foo
、個々のアイテムをとして参照し$foo[1]
ます。
- ハッシュ:これらはキー値です。各値には一意のキーがあります。順序はありませんが、キーに基づいて値をすばやく見つけることができます。ハッシュをとして参照し
%foo
、個々のアイテムをとして参照し$foo{BAR}
ます。
これらすべてに個別の値が含まれていることに注意してください。配列またはハッシュの各要素は、単一の値のみを持つことができます。たとえば、ホストマシンのハッシュ( USAmazon
、、など)EUAmazon
があり、各ホストを1つの国($host{USAmazon} = 'US';
、$host{EUAmazon} =
GB`など)に関連付けたいとします。これはPerlで簡単に実装できます。
残念ながら、そうではありません。各ホストマシンは、国コードの配列全体に関連付けることができます。可能な国コードの配列全体をホストマシンのハッシュに入れるにはどうすればよいですか?ここで参照が入ります。国コードのリストがあると想像してください。そのリストのメモリ位置を見つけることができれば、そのメモリ位置をハッシュの参照として使用できます。したがって、私のハッシュには、キーごとに1つの値が含まれています。たまたま、キーは特定のリストに対するメモリ内の場所です。
これが参照とは何か、そしてなぜあなたは時々のような値を見るのかですARRAY(0x12FFc)
。これは、ハッシュに格納されている配列のメモリ位置です。
実際に標準のPerlディストリビューションの一部である参照に関する素晴らしいPerlチュートリアルがあります。これは、開始するのに最適な場所です。
ただし、簡単な基本ガイド...
- Perl変数型への参照は、その前に円記号を付けるだけで取得できます。
例えば:
$reference_to_foo_array = \@foo;
印刷すると、これがメモリ位置の配列であること$reference_to_foo_array
がわかるようなものが表示されます。ただし、配列全体を単一のハッシュまたは配列要素に格納できるようになりました。ARRAY(0x12FFc)
0x12FFc
@foo
$some_array[0] = $reference_to_foo_array;
- 参照がある場合は、その前に正しい変数型記号を付けることで、Perl変数に戻すことができます。これは間接参照と呼ばれます。
例えば:
@another_array = @{$reference_to_foo_array};
多くの場合、中括弧を削除できます。
@another_array = @$reference_to_foo_array;
私は非常に複雑なオブジェクトを持つことができます。例えば。私は人のハッシュを持っています、各ハッシュには電話タイプのハッシュが含まれています。各電話タイプには、そのタイプの電話のリストが含まれています。たとえば、2つの勤務先電話番号と2つの携帯電話があるとします。
$person{DAVID};
これはDAVIDの電話を指します。ただし、これは実際には電話タイプのハッシュです。これを印刷すると、次のようになりますHash(0x12b23)
。
特定の電話タイプが必要な場合は、次のようにします。
${$person{DAVID}}{CELL};
これはデビッドの携帯電話番号のリストです。これを印刷するとArray(0x3458b)
、電話番号の配列の参照であるため、次のようになります。
これは、DAVIDの最初の携帯電話を指します。
${${$phone{DAVID}}{CELL}}[0];
括弧がないと、次のように表示されます。
$$$phone{DAVID}{CELL}[0];
幸い、Perlには読みやすくする構文糖衣があります。
$phone{DAVID}->{CELL}->[0];
これは、電話番号の配列を参照する(電話タイプの)別のハッシュを参照する(人の)ハッシュがあることを示しています。
Perlには、実際に名前を付けずにハッシュまたは配列を作成する方法もあります。これにより、匿名のハッシュが作成されます。
$phone{DAVID} = {};
これで、DAVIDの電話タイプのハッシュを取得できます。匿名配列を作成する方法は次のとおりです。
$phone{DAVID}->{CELL} = [];
これで、DAVIDの携帯電話番号のリストを取得できます。
さらにいくつか:
モジュールData::Dumperを見てください。これは、これらの非常に複雑なデータ型の構造を印刷するのに役立ち、見ているものを理解するのに役立ちます。
Perl関数refを見てください。これは、あなたが見ているものを理解するのに役立ちます。例えば:
私の$data_type= ref $ phone {DAVID}-> {CELL}
に設定さ$data_type
れARRAY
ます。$phone{DAVID}->{CELL}
これにより、これは電話番号ではなく、電話番号のリスト(または別の参照タイプのリスト)であることがわかります。