10

「一流の実体」とは何を定義し、「二流の実体」とどう違うのですか?

「正規表現は、qr //演算子を使用して作成された場合、現代のPerlのファーストクラスのエンティティである」(現代のPerlから引用:本)とはどういう意味ですか。

4

3 に答える 3

12

MeNoMoreが正しく言っているように、ファーストクラスエンティティは、変数などに自由に割り当てることができる言語のデータ型です。Perlでは、これらには次のものが含まれます。

  • スカラー
  • 配列
  • ハッシュ
  • Coderefs(匿名サブルーチンなど)
  • IO
  • Typeglobs(シンボルテーブルはglobのハッシュです)
  • フォーマット

それらはシンボルテーブルに常駐できます。スカラースロットは、他のさまざまなタイプで占有できます。

  • 符号付き整数
  • 符号なし整数
  • 浮動小数点数
  • 文字列
  • 参考文献
  • 正規表現

これらのエンティティの一部には、言語に組み込みのコンストラクタがあります。スカラーの数値および文字列リテラル、配列とハッシュのリスト表記、匿名の配列とハッシュ参照、コードの[]キーワード、IOオブジェクトの関数、フォーマットの組み込み、参照用の参照演算子、およびregexes用の演算子。{}subopenformatqr{}

Perlには、ファーストクラスのエンティティではなく、スカラーやその他のファーストクラスのエンティティに割り当てることができない言語構造があります。たとえば、パッケージ。このコードは機能しません:

my $anonymous_package = package { ... };  # XXX

シェルコマンドには独自の組み込みがありますが、データオブジェクトではないため、これは機能しません。

# don't execute `yes`, but store a handle to it in reference
my $shell_command = \qx{yes};

代わりに、このステートメントは終了しないでください(そしておそらくあなたの記憶を吹き飛ばします)。

Perlのリストは言語構造ですが、データ型はありません。

my $listref = \($x, $y, $z); # assigns reference to $z instead

Perlの組み込み型には、強制ルールを含めることができます。

  • 数字と文字列は前後に強制されます。
  • リストコンテキストの単一のスカラーは、アリティ1のリストです。
  • スカラーコンテキストの配列は、配列の長さに評価されます
  • (偶数の値の)配列をハッシュに割り当てることができます
  • この配列を別のハッシュに割り当てると同じハッシュが再作成されるように、ハッシュを配列に割り当てることができます
  • スカラーコンテキストのハッシュは、(a)空の場合はfalse値、(b)埋められて割り当てられたバケットの数を示す文字列、1/8または(c)数値コンテキストのキーの数に評価されます。
  • 文字列コンテキストの正規表現はqr(ab?c) eq "(?-xism:ab?c)"、perlのバージョンに応じて、指定されたものと同じように動作するパターン文字列に評価されます。

オブジェクトをオーバーロードして、オーバーロードを通じて同様の強制ルールを表示できます。

正規表現参照の場合、そのような参照を含むスカラーは、たとえばパターンで、正規表現リテラルと交換可能に使用できます。

$string =~ /ab?c/

正規表現は、上記のような$regex場合に置き換えることができます。$regex

my $regex = qr/ab?c/;
$string =~ $regex ### no dereferencing syntax!
# $string =~ /$regex/ will work too, but may invoke string overloading first (?)

たとえば、coderefにはより多くのbiolerplateコードが必要です。

sub foo {...}
foo();

my $foo = sub {...};
$foo->();  # two possibilities
&$foo();
于 2012-11-19T08:49:04.067 に答える
4

Perl5.12のリリースノートには次のものが含まれます。

正規表現がファーストクラスになりました

内部的には、Perlはコンパイルされた正規表現(qr //で作成されたものなど)をファーストクラスのエンティティとして扱うようになりました。この変更のために、シリアル化、逆シリアル化、またはPerlの内部データ構造との深い相互作用を持つPerlモジュールを更新する必要があります。影響を受けるほとんどのCPANモジュールは、この記事の執筆時点ですでに更新されています。

5.12より前は、正規表現エンジンだけがコンパイルされた正規表現について何も知りませんでした。コンパイルされた正規表現をスカラーに格納すると、コンパイルされた正規表現パターンへのポインターを含むラッパー(への参照)が格納されました。

# 5.10.1
> perl -MDevel::Peek -e"Dump qr/abc/"
SV = RV(0x3be060) at 0x3be050
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x3be0b0
  SV = PVMG(0x2bbfd8) at 0x3be0b0     <--- Uses a generic magic scalar
    REFCNT = 1
    FLAGS = (OBJECT,SMG)
    IV = 0
    NV = 0
    PV = 0
    MAGIC = 0x262aa8
      MG_VIRTUAL = 0x28199d00
      MG_TYPE = PERL_MAGIC_qr(r)
      MG_OBJ = 0x2bdd68           <---- Regex is actually stored
        PAT = "(?-xism:abc)"            outside the scalar.
        REFCNT = 2
    STASH = 0x3bead0    "Regexp"

5.12以降、整数や文字列と同様に、スカラーの適切なサブタイプになりました。コンパイルされた正規表現をスカラーに格納する場合、コンパイルされた正規表現パターン自体(への参照)を格納します。

# 5.16.1
>perl -MDevel::Peek -e"Dump qr/abc/"
SV = IV(0x74b1b8) at 0x74b1bc
  REFCNT = 1
  FLAGS = (TEMP,ROK)
  RV = 0x74b1cc
  SV = REGEXP(0x33b8a4) at 0x74b1cc   <--- REGEXP is a subtype of scalar
    REFCNT = 1
    FLAGS = (OBJECT,POK,FAKE,pPOK)
    PV = 0x31f90c "(?^:abc)"
    CUR = 8
    LEN = 0
    STASH = 0x74baec    "Regexp"
    EXTFLAGS = 0x680000 (CHECK_ALL,USE_INTUIT_NOML,USE_INTUIT_ML)
    INTFLAGS = 0x0
    NPARENS = 0
    LASTPAREN = 0
    LASTCLOSEPAREN = 0
    MINLEN = 3
    MINLENRET = 3
    GOFS = 0
    PRE_PREFIX = 4
    SEEN_EVALS = 0
    SUBLEN = 0
    SUBBEG = 0x0
    ENGINE = 0x280cfac0
    MOTHER_RE = 0x328a54
    PAREN_NAMES = 0x0
    SUBSTRS = 0x326174
    PPRIVATE = 0x351c04
    OFFS = 0x74343c

これは、リリースノートが「ファーストクラス」によって意味するものです。しかし、この本はアモンの定義を使用していると思います。

于 2012-11-19T10:00:25.643 に答える
1

ウィキペディアから:

プログラミング言語の設計において、特定のプログラミング言語のコンテキストにおける第一級市民 (オブジェクト、エンティティ、または値も) は、実行時に構築され、パラメーターとして渡され、サブルーチンから返されるエンティティです。 、または変数に割り当てられます。コンピュータ サイエンスでは、具体化という用語は、何かを第一級のオブジェクトにするプロセス (技術、メカニズム) を指すときに使用されます。

次の場合、オブジェクトはファーストクラスです。

  • 変数とデータ構造に格納できます

  • パラメータとしてサブルーチンに渡すことができます

  • サブルーチンの結果として返すことができます

  • 実行時に構築可能

  • 固有のアイデンティティを持っている (任意の名前とは無関係)

    「オブジェクト」という用語は、ここでは大まかに使用されており、必ずしもオブジェクト指向プログラミングのオブジェクトを指しているわけではありません。整数や浮動小数点数などの最も単純なスカラー データ型は、ほとんどの場合、ファースト クラスです。

于 2012-11-19T07:52:00.700 に答える