gotanda.pm LT
2021/05/21(金)
id:anatofuz
my $self = shift
https://gyazo.com/e229294c02adb34d78424da7606d09f6
id:anatofuz
3月まで沖縄にいました
今は京都にいます
株式会社はてな アプリケーションエンジニア
ノベルチームでカクヨムと魔法のiらんどに関わっています
業務で合法的にPerlを書いています
最近の暮らし
ついに社会に放出されています
アセンブラを見続けていた生活から一変してwebアプリしてる
PerlとかTypeScriptを書いています
@_から引数を取らない暮らし
素のvimからvscodeを使うようにしている
数年ぶりにlinterとかformatterがある暮らし
2年くらい気合でやるしかない言語を書いていた
PR
https://gyazo.com/fb8b629108d67bb0fe3d0a5ac7181b6d
新卒やってるanatofuz.iconが見れます
ネタに迷ったので
この前見つけたRakuのカンファレンスの話
Data::Printerテクニック集
最近のRaku事情
オンラインカンファレンス
オンラインカンファレンス
今年の8月7日
初めてのRakuだけのカンファレンス!!!
無料でチケットを買えるのでぜひ
Tシャツは自分でプリントアウトする方針
ブログ書いてツイートしたら
https://gyazo.com/6b609288503eb8a5563a38e56a1bd9c7
拾われる
https://gyazo.com/a3b8e5e7c6795b336cd0394eb1ca8b35
Data::Printerテクニック集
Data::Printer
Data::Dumper(コアモジュール)のようなPerlのダンプツール
Data::Dumperと違って
多機能
色付き
タイプ数が少ない
通称DDP
DPPはDining Philosophers Problem
2021-02-24に1.000000がリリースされている
Data::PrinterのAPI
わずか2つ
p
np
シンプルですね
基本形
pを使うとSTDERRにダンプされます
code:perl
use DDP;
p $hoge
npを使うと文字列として帰ってくる(色はつかない)
code:perl
use Data::Printer;
my $hoge = np($hoge);
print $hoge;
よいところ
日本語がなにもしなくてもそのままでる
code:perl
use Data::Printer;
use utf8;
use Data::Dumper;
print Dumper $anatofuz;
p $anatofuz;
code:Data::Dumper
$perl hoge.pl
$VAR1 = [
"\"\x{30a2}\x{30ca}\x{30b0}\x{30e9}\x{3067}\x{3059}!!!!\""
];
code:Data::Printer
Wide character in print at /Users/anatofuz/.plenv/versions/5.32.0/lib/perl5/site_perl/5.32.0/Data/Printer.pm line 153.
[
]
オブジェクトがみやすい
メソッド一覧とか、クラス名とか
code:perl
package AnaTofuZ {
sub new {
my ($class, %args) = @_;
my $self = {
%args
};
return bless $self, $class;
}
sub _private {
print "private!";
}
}
use Data::Printer;
use utf8;
use Data::Dumper;
my $anatofuz = AnaTofuZ->new( key => 'value' );
p $anatofuz;
print Dumper $anatofuz;
code:Data::Printer
AnaTofuZ {
public methods (1): new
private methods (1): _private
internals: {
key "value"
}
}
code:Data::Dumper
$VAR1 = bless( {
'key' => 'value'
}, 'AnaTofuZ' );
STDERRに出すの嫌なとき
outputで指定できる
pの後ろにオプションが渡せる
code:perl
use Data::Printer;
my $foo = p($hoge, output => stdout);
他にも色々
変数やファイルハンドルにもいれられる
code:perl
my $foo;
p($hoge, output => \$foo);
リファレンス表示したい
いきなりこれはできない
code:perl
p([qw/ 1 2 3/);
デリファレンスするとできる
後置デリフ便利ですね
code:perl
.dataprinter
最近追加
ホームディレクトリ、プロジェクトルートに.dataprinterを置くとDDPの設定ができる
Data::Printer::Configモジュールでファイル探索している
色変えたい
.dataprinterで色を指定可能
Pod::Text::Color::Delightっぽいですね
ありとあらゆる場所からよびだい
こうするとできるらしい
本当?
code:perl
BEGIN {
{
no strict 'refs';
require Data::Printer;
my $alias = 'p';
foreach my $package ( keys %main:: ) {
if ( $package =~ m/::$/ ) {
*{ $package . $alias } = \&Data::Printer::p;
}
}
}
}
Perl標準デバッガから呼び出す
DB::Pluggableを使うとできる
.perldbに以下の内容をいれるとperl -dでデバッガ起動してpで呼び出せる
code:perl
use DB::Pluggable;
DB::Pluggable->run_with_config( \'DataPrinter' ); # note the '\' STDERRに出す標準設定だとデバッガの操作とSTDERRの内容は別で出すので2回出力される
STDOUTにするように設定すると便利
修論かいてたときに死ぬほど使ってた
Data::Dumperからの置き換え
これを
code:perl
use Data::Dumper;
こう
code:perl
use Data::Printer;
sub Dumper { np @_, colored => 1 }
活用事例
軽く見ると社内でもデバッグツールとして使われているっぽい
当然Data::Dumperも根強い人気
OSSではData::Printerと組わせていい感じに情報を表示する系のツールとして使われている
Devel::PrettyTrace
Devel::PrettyTrace
スタックトレースをいい感じに表示してくれるくん
内部でDB::argsをpに渡して整形している
DB名前空間はPerlのデバッグ用のAPI
code:perl
sub format_args {
my $result = p(@DB::args, %Opts);
$result =~ s/^.*?\n/\n/;
$result =~ s/\]$//;
$result =~ s/\n/\n$Indent/go;
return $result;
}
標準デバッガ
標準でも見れないことはない
code:exec
❯ perl -d sub3.pl
Loading DB routines from perl5db.pl version 1.57
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(sub3.pl:23): func1(qw/arg1 arg2 arg3/);
DB<1> b func2
DB<2> c
before func2 $tmp_arg => tmp!
main::func2(sub3.pl:17): my $msg = shift;
DB<2> T
@ = DB::DB called from file 'sub3.pl' line 17
. = main::func2('arg1', 'arg2', 'arg3', 'hello', 'bar', 'baz', 'tmp!') called from file 'sub3.pl' line 11
. = main::func1('arg1', 'arg2', 'arg3') called from file 'sub3.pl' line 23
Devel::PrettyTraceを使うと
多少きれい
プリントデバッグで使えてべんり
code:log
main::func2(
]) called at sub2.pl line 9
main::func1(
]) called at sub2.pl line 18
arg1
小ネタ read-onlyな引数
引数@_と$_で参照すると変数そのものが来るので書き換えることが出来るぞ!!!
あんまりやりたくはない!!!!!
code:perl
use strict;
use warnings;
use feature qw/say/;
use Devel::PrettyTrace qw/bt/;
sub func1 {
my @args = @_;
my $tmp_arg = "tmp!";
say 'before func2 $tmp_arg => ', $tmp_arg;
func2(@args,qw/hello bar baz/, $tmp_arg);
say 'after func2 $tmp_arg => ', $tmp_arg;
}
sub func2 {
my $msg = shift;
bt();
}
func1(qw/arg1 arg2 arg3/);
実行すると書き換わっている!!
code:exec
ce perl sub2.pl
before func2 $tmp_arg => tmp!
main::func2(
]) called at sub2.pl line 12
main::func1(
]) called at sub2.pl line 25
after func2 $tmp_arg => rewrite!
まとめ
Data::Printer便利!
おすすめ.dataprinterの設定おしえてください