���Ͼ��٤����Ȥ������Ȥ�B::Deparse
�ξҲ�
������ץȸ����Ѥ� CUI�ΥǥХå��λȤ������ñ�ˤޤȤ�ޤ������оݸ���� Ruby, Python, Perl �Ǥ���
�¤ϻ�⡢�ǥХå�����perl -de1
���餤�����ȤäƤ��ʤ�(perl -de1
�����ˤ褯�Ȥ��Τǡ�Terminal.app�Υ�����ɥ��ΰ�Ĥ��������ѤˤʤäƤ��롣������ץȸ���Υ��󥿥饯�ƥ��֤�����ˡ�˴ؤ��Ƥϰ�����404 Blog Not Found:LL Intaractive�פˤޤȤ᤿�ΤǤ��������ĺ���Ȥ��ơ������ǤϤʤ�������ץȸ���Ǥ���¿�˥ǥХå�����Ȥ�ʤ����򤪤��餤������ǡ�B::Deparse
����夲�롣
��� C, C++ �ǥץ�������񤤤Ƥ���Ȥ��ϥǥХå� (��� GNU/Linux ��� gdb) �����ˤ����Ѥ��ޤ�����������������ץȸ���ǤϤ���ۤɤǤ⤢��ޤ��󡣤���Ϥ����餯���Τ褦����ͳ�ˤ��ޤ���
- �ӥ�ɤ����פʤΤ� printf �ǥХå����ư� (���������ç¤ï¿½ï¿½ C++ �Υץ������Ǥϥӥ�ɻ��֤�Ĺ���Τ� printf �������Ϥ���ɤ�)
- �۾ェλ���˥����å��ȥ졼����ɽ������� (Ruby, Python �ʤ鼫ư��Perl �ξ��� use Carp; $SIG{__DIE__} = \&Carp::confess; �ʤ�)
- ���֥������ȤΥ��󥹥ڥ��Ȥ���ñ (Ruby �ʤ� p/pp, Python �ʤ� print, Perl �ʤ� Data::Dumper)
- �������ơ������ե���Ȥ� (����Ū��) ȯ�����ʤ�
- ������ñ��ʥץ�������񤤤Ƥ����礬¿��
Perl�ξ�硢����������B::Deparse
�����뤫��פȤ�����Τ�ä����������줯�餤�����ʥġ���Ǥ��롣
����ˡ���ΰ�:������ץ����Τ�Deparse
Perl�ΰ�̾����ͳ�ΰ�Ĥϡ��ֽñ¤¤ä¤¹ï¿½ï¿½ï¿½ï¿½ï¿½É¤ß¤Ë¤ï¿½ï¿½ï¿½ï¿½×¤È¤ï¿½ï¿½ï¿½ï¿½ï¿½Î¤Ç¤ï¿½ï¿½Ã¤ï¿½ï¿½ï¿½ï¿½ÂºÝ¤ï¿½ï¿½ï¿½ï¿½Ç¤ï¿½Ê¤ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½òº£¡ï¿½ï¿½Ã¤Ë¡ï¿½Perl Best Practices�פ��尴����Ƥ����blogosphere�����魯code snippets�β�������ߤ�������褦�˾夬�ä��Τ���������Ǥ�����Ϻ(one-line)�ʤɤ��ɤߤ䤹����2�μ�3�������golf��Obfuscnated Codes�ʤɡ��虜���ɤߤˤ������Ƥ����Τ⤢�롣
����ʻ��ϡ�B::Deparse
�ˤ��Υ����ɤ��ɤ߲򤤤Ƥ�餪�����Ȥ����ϴ�ñ��
perl ...
�Ȥ��Ƥ����Ȥ�����
perl -MO=Deparse ...
�Ȥ���Ф褤��-MB=Deparse
�Ǥʤ��������ա����Υ����ɤ��¹Ԥ��������ˡ����Υ����ɤ�Perl���鸫�Ƥɤ�����������ɽ������롣
�㤨�С��֥ե���������о줹��0.01�ò¤¹¤Ù¤ï¿½0.02�˽ñ¤´ï¿½ï¿½ï¿½ï¿½Æ¡ï¿½ï¿½ï¿½ï¿½Î¥Õ¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð¥Ã¥ï¿½ï¿½ï¿½ï¿½Ã¥×¤ï¿½ï¿½ï¿½×¤È¤ï¿½ï¿½ï¿½ï¿½ï¿½È¤Ê¤é¡¢
perl -i.bak -ple 's/0\.01/0.02/g' files ...
�Ƚ񤯤��������-MB=Deparse
��դ꤫����Ȥ���ɽ������롣
% perl -MO=Deparse -i.bak -ple 's/0\0.1/0.02/g'
BEGIN { $^I = ".bak"; }
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = )) {
chomp $_;
s/0\0.1/0.02/g;
}
continue {
print $_;
}
-e syntax OK
�֤���ʥ֥����פΥǥХå�(debugee - ���졢�ХåɥΥ��ϥ��Ѹ�ǾҲ𤷤Ƥ⤤���ΤǤ�)�⡢������Perl Monger�ʤ餳�����Ƥ����������
perl -MLWP::Simple -e 'print get shift' http://0xcc.net
����⡢-MB=Deparse
�ǡָ����᤻�פ롣
% perl -MO=Deparse -MLWP::Simple -e 'print get shift' http://0xcc.net use LWP::Simple; print get(shift @ARGV); -e syntax OK
ɽ������Ĵ�����뤳�Ȥ����롣�㤨�Ф�������ˡ�
% perl -MO=Deparse,-l,-x7 -MLWP::Simple -e 'print get shift' http://0xcc.net
#line 0 "-e"
sub BEGIN {
#line 0 "-e"
require LWP::Simple;
#line 0 "-e"
do {
#line 0 "-e"
'LWP::Simple'->import
};
}
#line 1 "-e"
print get(shift @ARGV);
-e syntax OK
�ܤ�������ˤ�ä�perldoc B::Deparse
�򻲾ȤΤ��ȡ�B::Deparse
�Ͻ鿴�Ԥ�̣���Ǥ��롣
���������㡼��ǥ�����������
���ʾ��Perl Programmer�ϡ�����code reference�����Ѥ��������ӻ��Ǥ��롣���˶��ϤʤΤ����������Ȥ��ƥǥХå����ˤ����Ȥ������Ȥ����롣��Τˤ�äƤ�ưŪ��code����������Τǡ������˼¹Ԥ���륳���ɤϤɤ��ʤΤ����������򸫤Ƥ⸫���ʤ��Τ���
����������������B::Deparse
�ν��֤Ǥ��롣
���Ȥ��С��ʲ��Τ褦�ʥ����ɤ�����Ȥ��롣
1 : use strict; 2 : use warnings; 3 : { 4 : package MyFileHandle; 5 : use base 'FileHandle'; 6 : sub each_line { 7 : my $fh = shift; 8 : my $coderef = shift; 9 : while ( my $line = $fh->getline ) { 10 : $coderef->( $fh, $line ); 11 : } 12 : } 13 : } 14 : my $fh = MyFileHandle->new( shift, 'r' ) or die; 15 : $fh->each_line( 16 : sub { 17 : my ( $fh, $line ) = @_; 18 : printf "%4d : %s", $fh->input_line_number, $line 19 : 20 : } 21 : );
�ޤ���������each_line
�����Ǥɤ��code reference�������ä������ǧ���Ƥߤ�����ΤȤ��롣��������Ф褤��
3 : { 4 : package MyFileHandle; 5 : use base 'FileHandle'; 6 : use B::Deparse; 7 : sub each_line { 8 : my $fh = shift; 9 : my $coderef = shift; 10 : my $bd = B::Deparse->new; 11 : warn $bd->coderef2text($coderef); 12 : while ( my $line = $fh->getline ) { 13 : $coderef->( $fh, $line ); 14 : } 15 : } 16 : }
����ȡ�each_line
���ƤФ������
{ use warnings; use strict 'refs'; my($fh, $line) = @_; printf '%4d : %s', $fh->input_line_number, $line; } at deparse.pl line 11.
�ȽФƤ��롣
�᥽�åɤ�ǥ�����������
�åµï¿½ï¿½ï¿½ï¿½Ç¡ï¿½ï¿½Õ¤ï¿½each_line()
����Ȥ�ƤӽФ�¦�dz�ǧ���������Ϥɤ�������褤��?
�������롣
15 : my $fh = MyFileHandle->new( shift, 'r' ) or die; 16 : use B::Deparse; 17 : my $bd = B::Deparse->new(); 18 : warn $bd->coderef2text($fh->can('each_line'));
�¹Ԥ����ȡ������ʤ롣
{ package MyFileHandle; use warnings; use strict 'refs'; my $fh = shift @_; my $coderef = shift @_; while (my $line = $fh->getline) { &$coderef($fh, $line); } } at deparse.pl line 18.
�����Ȥ��С��ǥХå�����Ȥ鷺�Ȥ�᥽�åɤΥ����ɤ����������Ǥ���Τ���
Data::Dumper��Storable���Ȥ߹�碌��
�¤�Data::Dumper
��Storable
�⡢B::Deparse
�򥵥ݡ��Ȥ��Ƥ��롣���������Ѥ���ȡ�code reference�����̤Υ��֥������ȤΤ褦�˰��ä��ꡢ���ꥢ�饤�������ꤹ�뤳�Ȥ���ñ�˽���롣�ܤ����Ϥ��줾��Υޥ˥奢��򻲾ȤΤ��ȡ�
�ޤȤ�
�ʾ�Τ褦�ˡ�B::Deparse
�Ͻ鿴�Ԥ�����Ԥޤǡ��¤˻Ȥ��ФΤ���⥸�塼��Ǥ��롣����Τ������Ǥ��ĤƤϥǥХå�����äƤ������Ȥ⤳��ǤۤȤ�ɴ֤˹礦�褦�ˤʤä���Ruby��Python�ǤϤɤ����Ƥ���Τ�������....
Dan the Perl Monger
���Υ֥����˥����Ȥ���ˤ�����������ɬ�פǤ���
��������������
���ε����ˤϵ��ĥ桼�����������Ȥ��Ǥ��ޤ���