ブログトップ 記事一覧 ログイン 無料ブログ開設

サンプルコードによるPerl入門 - Perlプログラミングの基礎から応用まで

サンプルが豊富なPerlの入門サイトです。if文、for文、配列、ハッシュ、正規表現を、丁寧に解説。Webサイトの作成方法、便利なPerlの関数とモジュールの紹介もあり。さらに、C言語を使った、Perlの拡張モジュールを作成する講座もあり。初級から上級まで、Perlのすべてが学べます。Twitter登録で、最新のPerl情報が得られます。

2016-03-28

opcode.h - オペレーションに関する情報 | Perl言語研究

 opcode.hには、それぞれのオペレーションに関する情報が記載されている。Perl言語研究では、「OP型」のデータのことを、オペレーションと呼ぶことにしています。Perlは、構文解析が終わると、構文木に変換されますが、このそれぞれのノードは「OP型」になっています。

 オペレーションは、オペレーションコードによって、分類され、それぞれが情報を持ちます。その情報が記述されています。

オペレーションの名前

 たとえば、オペレーションの名前が記述されています。

EXTCONST char* const PL_op_name[] = {
  "null",
  "stub",
  "scalar",
  "pushmark",
  "wantarray",
  "const",
  "gvsv",
  ...
};

続きを読む

2016-03-26

opnames.h - オペレーションコードの一覧 | Perl言語研究

 opnames.hには、オペレーションコードが記述されています。

/* opname.h */
typedef enum opcode {
  OP_NULL    = 0,
  OP_STUB    = 1,
  OP_SCALAR  = 2,
  OP_PUSHMARK  = 3,
  OP_WANTARRAY   = 4,
  OP_CONST   = 5,
  OP_GVSV    = 6,
  ...
};

 Perlは、構文解析が行われた後に、コードが、構文木として表現されるのですが、構文木のひとつひとつのノードは、オペレーションと呼ばれます。これは「OP型」として表現されます。たとえば「pushする」とか「ハッシュのキーの存在を確かめる」とか「サブルーチンを実行する」とか「スカラを表現する」とか、そういうPerlのプログラミング上での操作が、オペレーションによって表現されます。

 オペレーションの種類を表すのが、オペレーションコードです。これは、列挙型です。

 「opnames.h」には、オペレーションコードが書かれていますが、それが、何を表すのかという解説がありません。解説を見たい場合は、「opcode.h」の「PL_op_desc」を参照するのがよいでしょう。

/* opcode.h */
EXTCONST char* const PL_op_desc[] = {
  "null operation",
  "stub",
  "scalar",
  "pushmark",
  "wantarray",
  "constant item",
  "glob value",
  ...
};


Perl言語研究

2016-03-25

embedvar.h - インタープリタ変数、グローバル変数の抽象化 | Perl言語研究

 embedvar.hは、インタープリタ変数、グローバル変数の抽象化のためのヘッダです。

インタープリタ変数の抽象化

 インタープリタ変数の抽象化のロジックは以下のようになっています。

#if defined(MULTIPLICITY)
/* cases 2 and 3 above */

#  if defined(PERL_IMPLICIT_CONTEXT)
#    define vTHX	aTHX
#  else
#    define vTHX	PERL_GET_INTERP
#  endif

#define PL_AboveLatin1		(vTHX->IAboveLatin1)
#define PL_Argv			(vTHX->IArgv)
#define PL_Cmd			(vTHX->ICmd)
#define PL_DBcontrol	(vTHX->IDBcontrol)

#endif

 まず「MULTIPLICITY」が定義されている場合というのは、複数のインタープリタが利用できる状態であるということです。そのような場合は、インタープリタごとの変数にアクセスする必要があります。

 次に、「PERL_IMPLICIT_CONTEXT」とは、暗黙のコンテキストが想定するという意味で、「Perl_」で始まる関数の第一引数に、インタープリタが渡されるということを意味します。

 一般的には「MULTIPLICITY」が定義されていれば「PERL_IMPLICIT_CONTEXT」が定義されていると考えてください。

 「aTHX」は次のように定義されています。

/* perl.h */
#ifdef PERL_IMPLICIT_CONTEXT
#  define aTHX	my_perl
#end

 my_perlは、グローバル変数であり、インタープリタを表しています。

/* perlmain.c */
static PerlInterpreter *my_perl;

 次に「PERL_IMPLICIT_CONTEXT」が定義されていない場合ですが、「PERL_GET_INTERP」は、次のように定義されていて、現在のインタープリタです。これは、グローバル変数です。

/* perl.h */
#  define PERL_GET_INTERP              (PL_curinterp)
/* perlvar.h */
PERLVARI(G, curinterp,	PerlInterpreter *, NULL)
					/* currently running interpreter
					 * (initial parent interpreter under
					 * useithreads) */

 「PERL_IMPLICT_CONTEXT」が定義されている場合は「vTHX」は「my_perl」として展開され、そうでない場合は「Gcurinterp」として展開されます。。

 そして、インタープリタ変数へのアクセスですが以下のように定義されています。

#define PL_AboveLatin1		(vTHX->IAboveLatin1)

グローバル変数の抽象化

 次にグローバル変数の抽象化のコードが書かれています。「PERL_GLOBAL_STRUCT」が、定義されている場合は、グローバル変数全体が、ひとつの構造体として存在しています、定義されていない場合は、通常のグローバル変数として存在しています。その二つの場合のどちらでも「PL_appctx」によって、変数にアクセスすることができます。

#if defined(PERL_GLOBAL_STRUCT)

#define PL_appctx		(my_vars->Gappctx)
#define PL_Gappctx		(my_vars->Gappctx)
#endif
/* perlmain.c */
struct perl_vars *my_vars = init_global_struct();


Perl言語研究

2016-03-22

perlvars.h - Perlのグローバル変数

 perlvars.hには、Perlのグローバル変数が定義されています。

/* perlvars.h */

/* global state */
#if defined(USE_ITHREADS)
PERLVAR(G, op_mutex,	perl_mutex)	/* Mutex for op refcounting */
#endif
PERLVARI(G, curinterp,	PerlInterpreter *, NULL)
					/* currently running interpreter
					 * (initial parent interpreter under
					 * useithreads) */
#if defined(USE_ITHREADS)
PERLVAR(G, thr_key,	perl_key)	/* key to retrieve per-thread struct */
#endif

 Perlには、インタープリタごとに持つインタープリタ変数がありますが、それとは別にグローバル変数も存在します。たとえば、現在実行しているインタープリタ、スレッドの競合を制御するためのミューテックスなどは、グローバル変数として定義されています。

 グローバル変数の宣言は、「PERLVAR」「PERLVARI」というマクロを使って記述されていま。これは「perl.h」で定義されています。

続きを読む

2016-03-21

interpvar.h - インタープリタ変数の定義 | Perl言語研究

 interpvar.hには、インタープリタ変数の定義が記述されています。インタープリタ変数とは、Perlのインタープリタごとに、定義される変数のことです。

インタープリタとは

 Perlは、複数のインタープリタを持つことができます。Perlは、インタープリタを生成して、ソースコードの解釈を始めます。通常は、インタープリタはひとつで十分ですが、C言語のプログラムの中で、複数保持したい場合は、複数生成することが可能です。

# 複数のインタープリタ
Perl - インタープリタ1
     |
     - インタープリタ2
     |
     - インタープリタ3

 ただし、Perlがインタープリタを複数持つことができるのは「MULTIPLICITY」というマクロが有効になっているときだけです。これは、コンパイルオプションとして設定できます。自分の環境の場合は、CentOSのデフォルトのPerlであれば、有効で、perlbrewでインストールしたものは、無効になっていました。パフォーマンスは「MULTIPLICITY」が有効になっていないもののほうが、速いようです。

 もし「MULTIPLICITY」が有効でなければ、Perlの構造は次のようになります。

Perl - (インタープリタなし)

続きを読む

2016-03-14

fileno関数 - ファイルディスクリプタを取得する

 ファイルディスクリプタを取得には、fileno関数を使用します。引数には、開かれているファイルハンドルを指定します。

$ret = fileno $fh;

 ファイルディスクリプタとは、ファイルや標準入出力などをOSが識別するために用いる識別子のことです。これは整数値です。

サンプル

 fileno関数を使ってファイルディスクリプタを取得するサンプルです。

use strict;
use warnings;

# コマンドライン引数からファイル名を取得
my $file = shift;

# ファイルを開く
open(my $fh, '<', 'file)
  or die "Can't open file $file:$!";

# ファイルディスクリプタを取得
my $fileno = fileno $fh;

# 出力
print "$fileno\n";

 出力結果

4


Perl逆引き事典