2

例えば:

use strict;
use warnings;
use Devel::Peek;

Dump({});

次のように出力します。

SV = IV(0x170fc98) at 0x170fca8
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x170fa68
  SV = PVHV(0x1715970) at 0x170fa68
    REFCNT = 1
    FLAGS = (SHAREKEYS)
    ARRAY = 0x0
    KEYS = 0
    FILL = 0
    MAX = 7
    RITER = -1
    EITER = 0x0

SV = IV(0x170fc98) at 0x170fca8 (数値、IV、スカラー) はPVHV (ハッシュ) SV = PVHV(0x1715970) at 0x170fa68 を参照しているようです

私は次のようなものを期待していました:

  SV = PVHV(0x1715970) at 0x170fa68
    REFCNT = 1
    FLAGS = (SHAREKEYS)
    ARRAY = 0x0
    KEYS = 0
    FILL = 0
    MAX = 7
    RITER = -1
    EITER = 0x0
4

2 に答える 2

3

はい、参照は常にスカラーです。

コンストラクト{ ... }は空のハッシュを作成し、それへの参照を返します。これはスカラーです。

に似ていdo { my %anon = ( ... ); \%anon }ます。

于 2014-01-01T20:45:02.413 に答える
3

Perl の各データ型には、参照カウントなどを提供するデータの共通の「ヘッダー」があります。このヘッダーのフラグは、実際の型を決定します (例: a PVHV)。したがって、内部的に a%hashは aPVHVです。ヘッダーの後には、他のハッシュ固有のフィールドが続きます。

とは何$reference = \%hashですか?参照は、別のデータ型へのポインターを含むスカラーです。これは の整数フィールドとして実装されますIVが、ROKフラグはデータが整数ではなくポインターであることを示すように設定されています。

Perl サブルーチンに渡すことができるのはスカラーのみです。したがって、ハッシュ自体ではなく、ハッシュ参照Dumpのみを渡すことができます。Dump提供するスカラーを出力すると、囲んでいる参照も表示されます。

Perl の内部データ型をよりよく理解するには、Illustrated Perl Gutsをお勧めします。

于 2014-01-01T20:45:12.560 に答える