鱒身(Masu_mi)のブログ

知った事をメモする場所。

初めてのPerl

だいぶ前に業務でPerl を触れた。 とりあえず遊ぶ準備が出来る所まで記録した。 近いうちに言語の特徴と便利そうなライブラリの記録も残しておく。

関連情報の調べ方

とりあえず下を知っていれば気楽になれる。

構文チェック・Perlデバッガはとても助かる。 他にも便利なモジュールがあるのでこれ を参考にした。

はじめてのPerlコード

さっそくPerlコードを書いてみる。

#!/usr/bin/env perl

# シンタックスエラー
sub add_10 {
  my ($v) = @_
  for (my $count = 0; $count < 10; $count++) {
    $v += 1
  }
  return $v
}

print "Hello World ";
print increment(2005)

シンタックスチェック

上記を以下の様にするとシンタックスチェックが動く。

$ perl -c ./test.pl
syntax error at ./test.pl line 5, near "0;"
syntax error at ./test.pl line 5, near "++) "
syntax error at ./test.pl line 9, near "$v
}"
./test.pl had compilation errors.

行末の”;” はコードブロックの終わりを除いて必要なので追記する。 そうして実行すると以下の様になる。

$ perl ./test.pl
Undefined subroutine &main::increment called at ./test.pl line 12.
Hello World

未定義な関数があるよって言われてからHello World って表示される。 ブロック内の名前解決は評価前に一括で実行される様な挙動をしている。 素直に関数名も修正して実行する。

$ perl ./test.pl
Hello World 2015

ちゃんと動く様で嬉しい。

解析ツール

プログラムの解析が必要な事は結構あって、Perlランタイムがどう呼ばれているか知りたいって事はあるので調べておいた。

プロファイラ dprofpp
デバッガ -d オプションを付けて実行すれば良いみたい(perldoc)

デバッガを使ってみる

試しに動かしたので解析する方法も知っておきたい。 最初に書いた様に-d オプションで起動するとデバッガが動くので試してみる。

$ perl -d ./test.pl
....
main::(./test.pl:11):   print "Hello World ";
  DB<1> h
List/search source lines:               Control script execution:
  l [ln|sub]  List source code            T           Stack trace
  - or .      List previous/current line  s [expr]    Single step [in expr]
  v [line]    View around line            n [expr]    Next, steps over subs
......
  DB<1> v
  9       }
  10
  11==>   print "Hello World ";
  12:     print add_10(2005)

よく使うのをメモしておくと以下になる。

コマンド 内容
h ヘルプ
cmd
ベージャを利用する
q デバッガ終了
直前(実行済み)の行を表示する。
. 現在(実行前)の行を表示する。
v[line] 指定した行周辺を表示
p expr perl式を評価する
M 読み込んでいるモジュールを表示する
T スタックトレースを表示する
b [ln|event|sub] [cnd] ブレークポイントを指定
w expr 式にwatchを設定
W expr|* 式のwatchを除去
s expr Step In 実行
n expr Next Step 実行
r リターン(現在のサブルーチンから脱出)