Perlのステップ実行方法まとめ

Published: 2016年2月13日 by tomsato

◼︎ 概要

Perlにはオプションでステップ実行機能が使える
難しい処理などを1行ずつコードを実行していくことができる
是非デバッグ(debug)時に活用したい

◼︎ メリット

  • どんな処理でエラーになっているのかが容易にわかる
  • 何行目のこの変数ではこういう値が入っているなどがわかる
  • 難しい処理でも1行ずつコードを追うことができる
  • オプションで「-d」を指定するだけなので容易に試せる
  • ステップ実行中に変数の値を変えられる

◼︎ デバッグ方法

// perlのデバッグ 「-dを指定する」
$ perl -d debug.pl

// 終了
> q

// 現在読み込まれているモジュールとバージョン番号を表示
> M

// メソッド
> m

// 全てのサブルーチンを表示
> S

// パッケージスコープ
> V

// パターンによって制限できる変数
> X

// 現在位置のコードを見る
// さらにコードを見るには再度vをタイプする
> v

// 周辺ソースコードが表示されるようになる(バックスラッシュは消してくださいmm)
> \{\{v

// 行移動する
> l (行番号)
例: > l 5

// 見ている場所を実行しようとしている場所にリセットする
> .

// 変数を表示
> p (変数)
例: > p $data

// 次の実行可能文に進む
> s

// ハッシュ変数を見やすく表示
> x \%data

// シングルステップ
> s
// シングルステップ(サブルーチン内部は検査しない)
> n

// 変数の変更
> $a=3

◼︎ デバッグ実践

今回は以下のソースを使って見る

#!/usr/local/bin/perl
use strict;
use warnings;

my $num = 3;
for(my $i=1;$i<=3;$i++) {
    print $num*$i."\n";
}

# 3の倍数を出力するプログラム
# 実行例
# $ perl debug.pl
# 3
# 6
# 9

ステップ実行してみる

$ perl -d debug.pl

Loading DB routines from perl5db.pl version 1.33
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(debug.pl:5): my $num = 3;
  DB<1> n
main::(debug.pl:7): for(my $i=1;$i<=3;$i++) {
  DB<1> n
main::(debug.pl:8):     print $num*$i."\n";
  DB<1> n
3
main::(debug.pl:8):     print $num*$i."\n";
  DB<1> n
6
main::(debug.pl:8):     print $num*$i."\n";
  DB<1> n
9
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.
  DB<1> q

シングルステップ実行できていることがわかる
nではなくsで実行していくと関数があった時に関数の内部まで追うことができる

色々使ってみる

$ perl -d debug.pl
... デバッグに不要な文面は中略 ...

main::(debug.pl:5): my $num = 3;
  DB<1> n
main::(debug.pl:7): for(my $i=1;$i<=3;$i++) {

// 周辺のソースコードを表示するようにする
  DB<1> \{\{v

// \{\{v (バックスラッシュは消してくださいmm)を叩いたことによってnを実行した際にソースコードも表示されている
  DB<2> n
main::(debug.pl:8):     print $num*$i."\n";
auto(-1)  DB<2> v
5:  my $num = 3;
6
7:  for(my $i=1;$i<=3;$i++) {
8==>        print $num*$i."\n";
9   }
10
11  # 3の倍数を出力するプログラム
12  # 実行例
13  # $ perl debug.pl
14  # 3
  DB<2> n
3
main::(debug.pl:8):     print $num*$i."\n";
auto(-1)  DB<2> v
5:  my $num = 3;
6
7:  for(my $i=1;$i<=3;$i++) {
8==>        print $num*$i."\n";
9   }
10
11  # 3の倍数を出力するプログラム
12  # 実行例
13  # $ perl debug.pl
14  # 3

// $numの値を変更してみる
  DB<2> $num=100

// $numの値を変更したことにより出力結果が変わっている
  DB<3> n
200
main::(debug.pl:8):     print $num*$i."\n";
auto(-1)  DB<3> v
5:  my $num = 3;
6
7:  for(my $i=1;$i<=3;$i++) {
8==>        print $num*$i."\n";
9   }
10
11  # 3の倍数を出力するプログラム
12  # 実行例
13  # $ perl debug.pl
14  # 3
  DB<3> n
300

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧