camel

���Ͼ��٤����Ȥ������Ȥ�B::Deparse�ξҲ�

����ʥ֥��� - ������ץȸ����ѤΥǥХå��λȤ��� - Ruby, Python, Perl
������ץȸ����Ѥ� 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