0

私は次のようなコードを持っています:

my %hosts = (
    'USAmazon' => ['US','CA'],
    'EUAmazon' => ['GB', 'FR', 'IT', 'ES', 'DE'],
    'CNAmazon' => ['CN'],
    'JPAmazon' => ['JP'],
);

my @values = $hosts{$ARGV[0]};

私はそれ$values[0][0]が米国を$values[0][1]保持し、CAを保持していることがわかります。どうしてこんなことに?説明してください。

また、どのようにして長さを知ることができます$values[0]か?

scalar $values[0]ARRAY(0x12FFc)何とか..何とか...のようなものを印刷します

リンクも役に立ちます。

4

4 に答える 4

5

あなたは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_typeARRAYます。$phone{DAVID}->{CELL}これにより、これは電話番号ではなく、電話番号のリスト(または別の参照タイプのリスト)であることがわかります。

于 2012-12-06T16:31:30.667 に答える
3

配列とハッシュ値は常にスカラーです。この場合、既存の要素の場合、$hosts{$ARGV[0]}配列への参照を含むスカラーです。配列を取得するには、その参照を逆参照する必要があります。

my $length = @{ $hosts{$ARGV[0]} };
于 2012-12-06T13:50:37.670 に答える
0

%hostshash は配列参照を値として保持します。それらを逆参照するだけで済みます。

my @values = @{$hosts{$ARGV[0]}};
于 2012-12-06T13:40:13.580 に答える
-1

為に

my @values = $hosts{$ARGV[0]};

はハッシュ$ARGV[0]のキーの 1 つです。たとえば'USAmazon'、ハッシュの対応する値は次の%hostsようになります。

['US','CA']

これは無名配列参照です。この構造体[ LIST ]は、スカラー値として使用される配列参照を作成するために使用されます。例:

my $foo = [ 1, 2, 3 ];    # $foo is a scalar

これを既存の配列から作成する場合は、次のようにすることもできます。

my @foo = (1, 2, 3);      # @foo is an array
my $foo = \@foo;          # reference to an array @foo

ただし、これにより、名前付き配列へのハードコードされたリンクが作成されます。匿名配列を使用しても、そうではありません。

ハッシュ (または配列) では、値はスカラー値のみです。したがって、ハッシュ値を配列に割り当てると、配列の最初の要素にそのスカラー値が割り当てられます。もちろん、配列の最初の要素は$array[0]. そう:

my $foo = $hosts{$ARGV[0]};   # [ 'US', 'CA' ]
my @bar = $foo;
print $bar[0];                # prints the array reference ARRAY(...)
print $foo;                   # same thing
print $foo->[0];              # 'US'
print $bar[0][0];             # 'US' (same thing)

詳細については、perldoc perldataを参照してください。

于 2012-12-06T14:08:58.887 に答える