1B::Deparse(3pm)        Perl Programmers Reference Guide        B::Deparse(3pm)
2
3
4

NAME

6       B::Deparse - Perl compiler backend to produce perl code
7

SYNOPSIS

9       perl -MO=Deparse[,-d][,-fFILE][,-p][,-q][,-l]
10               [,-sLETTERS][,-xLEVEL] prog.pl
11

DESCRIPTION

13       B::Deparse is a backend module for the Perl compiler that generates
14       perl source code, based on the internal compiled structure that perl
15       itself creates after parsing a program.  The output of B::Deparse won't
16       be exactly the same as the original source, since perl doesn't keep
17       track of comments or whitespace, and there isn't a one-to-one
18       correspondence between perl's syntactical constructions and their
19       compiled form, but it will often be close.  When you use the -p option,
20       the output also includes parentheses even when they are not required by
21       precedence, which can make it easy to see if perl is parsing your
22       expressions the way you intended.
23
24       While B::Deparse goes to some lengths to try to figure out what your
25       original program was doing, some parts of the language can still trip
26       it up; it still fails even on some parts of Perl's own test suite.  If
27       you encounter a failure other than the most common ones described in
28       the BUGS section below, you can help contribute to B::Deparse's ongoing
29       development by submitting a bug report with a small example.
30

OPTIONS

32       As with all compiler backend options, these must follow directly after
33       the '-MO=Deparse', separated by a comma but not any white space.
34
35       -d  Output data values (when they appear as constants) using
36           Data::Dumper.  Without this option, B::Deparse will use some simple
37           routines of its own for the same purpose.  Currently, Data::Dumper
38           is better for some kinds of data (such as complex structures with
39           sharing and self-reference) while the built-in routines are better
40           for others (such as odd floating-point values).
41
42       -fFILE
43           Normally, B::Deparse deparses the main code of a program, and all
44           the subs defined in the same file.  To include subs defined in
45           other files, pass the -f option with the filename.  You can pass
46           the -f option several times, to include more than one secondary
47           file.  (Most of the time you don't want to use it at all.)  You can
48           also use this option to include subs which are defined in the scope
49           of a #line directive with two parameters.
50
51       -l  Add '#line' declarations to the output based on the line and file
52           locations of the original code.
53
54       -p  Print extra parentheses.  Without this option, B::Deparse includes
55           parentheses in its output only when they are needed, based on the
56           structure of your program.  With -p, it uses parentheses (almost)
57           whenever they would be legal.  This can be useful if you are used
58           to LISP, or if you want to see how perl parses your input.  If you
59           say
60
61               if ($var & 0x7f == 65) {print "Gimme an A!"}
62               print ($which ? $a : $b), "\n";
63               $name = $ENV{USER} or "Bob";
64
65           "B::Deparse,-p" will print
66
67               if (($var & 0)) {
68                   print('Gimme an A!')
69               };
70               (print(($which ? $a : $b)), '???');
71               (($name = $ENV{'USER'}) or '???')
72
73           which probably isn't what you intended (the '???' is a sign that
74           perl optimized away a constant value).
75
76       -P  Disable prototype checking.  With this option, all function calls
77           are deparsed as if no prototype was defined for them.  In other
78           words,
79
80               perl -MO=Deparse,-P -e 'sub foo (\@) { 1 } foo @x'
81
82           will print
83
84               sub foo (\@) {
85                   1;
86               }
87               &foo(\@x);
88
89           making clear how the parameters are actually passed to "foo".
90
91       -q  Expand double-quoted strings into the corresponding combinations of
92           concatenation, uc, ucfirst, lc, lcfirst, quotemeta, and join.  For
93           instance, print
94
95               print "Hello, $world, @ladies, \u$gentlemen\E, \u\L$me!";
96
97           as
98
99               print 'Hello, ' . $world . ', ' . join($", @ladies) . ', '
100                     . ucfirst($gentlemen) . ', ' . ucfirst(lc $me . '!');
101
102           Note that the expanded form represents the way perl handles such
103           constructions internally -- this option actually turns off the
104           reverse translation that B::Deparse usually does.  On the other
105           hand, note that "$x = "$y"" is not the same as "$x = $y": the
106           former makes the value of $y into a string before doing the
107           assignment.
108
109       -sLETTERS
110           Tweak the style of B::Deparse's output.  The letters should follow
111           directly after the 's', with no space or punctuation.  The
112           following options are available:
113
114           C   Cuddle "elsif", "else", and "continue" blocks.  For example,
115               print
116
117                   if (...) {
118                        ...
119                   } else {
120                        ...
121                   }
122
123               instead of
124
125                   if (...) {
126                        ...
127                   }
128                   else {
129                        ...
130                   }
131
132               The default is not to cuddle.
133
134           iNUMBER
135               Indent lines by multiples of NUMBER columns.  The default is 4
136               columns.
137
138           T   Use tabs for each 8 columns of indent.  The default is to use
139               only spaces.  For instance, if the style options are -si4T, a
140               line that's indented 3 times will be preceded by one tab and
141               four spaces; if the options were -si8T, the same line would be
142               preceded by three tabs.
143
144           vSTRING.
145               Print STRING for the value of a constant that can't be
146               determined because it was optimized away (mnemonic: this
147               happens when a constant is used in void context).  The end of
148               the string is marked by a period.  The string should be a valid
149               perl expression, generally a constant.  Note that unless it's a
150               number, it probably needs to be quoted, and on a command line
151               quotes need to be protected from the shell.  Some conventional
152               values include 0, 1, 42, '', 'foo', and 'Useless use of
153               constant omitted' (which may need to be -sv"'Useless use of
154               constant omitted'."  or something similar depending on your
155               shell).  The default is '???'.  If you're using B::Deparse on a
156               module or other file that's require'd, you shouldn't use a
157               value that evaluates to false, since the customary true
158               constant at the end of a module will be in void context when
159               the file is compiled as a main program.
160
161       -xLEVEL
162           Expand conventional syntax constructions into equivalent ones that
163           expose their internal operation.  LEVEL should be a digit, with
164           higher values meaning more expansion.  As with -q, this actually
165           involves turning off special cases in B::Deparse's normal
166           operations.
167
168           If LEVEL is at least 3, "for" loops will be translated into
169           equivalent while loops with continue blocks; for instance
170
171               for ($i = 0; $i < 10; ++$i) {
172                   print $i;
173               }
174
175           turns into
176
177               $i = 0;
178               while ($i < 10) {
179                   print $i;
180               } continue {
181                   ++$i
182               }
183
184           Note that in a few cases this translation can't be perfectly
185           carried back into the source code -- if the loop's initializer
186           declares a my variable, for instance, it won't have the correct
187           scope outside of the loop.
188
189           If LEVEL is at least 5, "use" declarations will be translated into
190           "BEGIN" blocks containing calls to "require" and "import"; for
191           instance,
192
193               use strict 'refs';
194
195           turns into
196
197               sub BEGIN {
198                   require strict;
199                   do {
200                       'strict'->import('refs')
201                   };
202               }
203
204           If LEVEL is at least 7, "if" statements will be translated into
205           equivalent expressions using "&&", "?:" and "do {}"; for instance
206
207               print 'hi' if $nice;
208               if ($nice) {
209                   print 'hi';
210               }
211               if ($nice) {
212                   print 'hi';
213               } else {
214                   print 'bye';
215               }
216
217           turns into
218
219               $nice and print 'hi';
220               $nice and do { print 'hi' };
221               $nice ? do { print 'hi' } : do { print 'bye' };
222
223           Long sequences of elsifs will turn into nested ternary operators,
224           which B::Deparse doesn't know how to indent nicely.
225

USING B::Deparse AS A MODULE

227   Synopsis
228           use B::Deparse;
229           $deparse = B::Deparse->new("-p", "-sC");
230           $body = $deparse->coderef2text(\&func);
231           eval "sub func $body"; # the inverse operation
232
233   Description
234       B::Deparse can also be used on a sub-by-sub basis from other perl
235       programs.
236
237   new
238           $deparse = B::Deparse->new(OPTIONS)
239
240       Create an object to store the state of a deparsing operation and any
241       options.  The options are the same as those that can be given on the
242       command line (see "OPTIONS"); options that are separated by commas
243       after -MO=Deparse should be given as separate strings.
244
245   ambient_pragmas
246           $deparse->ambient_pragmas(strict => 'all', '$[' => $[);
247
248       The compilation of a subroutine can be affected by a few compiler
249       directives, pragmas.  These are:
250
251       •   use strict;
252
253       •   use warnings;
254
255       •   Assigning to the special variable $[
256
257       •   use integer;
258
259       •   use bytes;
260
261       •   use utf8;
262
263       •   use re;
264
265       Ordinarily, if you use B::Deparse on a subroutine which has been
266       compiled in the presence of one or more of these pragmas, the output
267       will include statements to turn on the appropriate directives.  So if
268       you then compile the code returned by coderef2text, it will behave the
269       same way as the subroutine which you deparsed.
270
271       However, you may know that you intend to use the results in a
272       particular context, where some pragmas are already in scope.  In this
273       case, you use the ambient_pragmas method to describe the assumptions
274       you wish to make.
275
276       Not all of the options currently have any useful effect.  See "BUGS"
277       for more details.
278
279       The parameters it accepts are:
280
281       strict
282           Takes a string, possibly containing several values separated by
283           whitespace.  The special values "all" and "none" mean what you'd
284           expect.
285
286               $deparse->ambient_pragmas(strict => 'subs refs');
287
288       $[  Takes a number, the value of the array base $[.  Obsolete: cannot
289           be non-zero.
290
291       bytes
292       utf8
293       integer
294           If the value is true, then the appropriate pragma is assumed to be
295           in the ambient scope, otherwise not.
296
297       re  Takes a string, possibly containing a whitespace-separated list of
298           values.  The values "all" and "none" are special.  It's also
299           permissible to pass an array reference here.
300
301               $deparser->ambient_pragmas(re => 'eval');
302
303       warnings
304           Takes a string, possibly containing a whitespace-separated list of
305           values.  The values "all" and "none" are special, again.  It's also
306           permissible to pass an array reference here.
307
308               $deparser->ambient_pragmas(warnings => [qw[void io]]);
309
310           If one of the values is the string "FATAL", then all the warnings
311           in that list will be considered fatal, just as with the warnings
312           pragma itself.  Should you need to specify that some warnings are
313           fatal, and others are merely enabled, you can pass the warnings
314           parameter twice:
315
316               $deparser->ambient_pragmas(
317                   warnings => 'all',
318                   warnings => [FATAL => qw/void io/],
319               );
320
321           See warnings for more information about lexical warnings.
322
323       hint_bits
324       warning_bits
325           These two parameters are used to specify the ambient pragmas in the
326           format used by the special variables $^H and ${^WARNING_BITS}.
327
328           They exist principally so that you can write code like:
329
330               { my ($hint_bits, $warning_bits);
331               BEGIN {($hint_bits, $warning_bits) = ($^H, ${^WARNING_BITS})}
332               $deparser->ambient_pragmas (
333                   hint_bits    => $hint_bits,
334                   warning_bits => $warning_bits,
335                   '$['         => 0 + $[
336               ); }
337
338           which specifies that the ambient pragmas are exactly those which
339           are in scope at the point of calling.
340
341       %^H This parameter is used to specify the ambient pragmas which are
342           stored in the special hash %^H.
343
344   coderef2text
345           $body = $deparse->coderef2text(\&func)
346           $body = $deparse->coderef2text(sub ($$) { ... })
347
348       Return source code for the body of a subroutine (a block, optionally
349       preceded by a prototype in parens), given a reference to the sub.
350       Because a subroutine can have no names, or more than one name, this
351       method doesn't return a complete subroutine definition -- if you want
352       to eval the result, you should prepend "sub subname ", or "sub " for an
353       anonymous function constructor.  Unless the sub was defined in the
354       main:: package, the code will include a package declaration.
355

BUGS

357       •   The only pragmas to be completely supported are: "use warnings",
358           "use strict", "use bytes", "use integer" and "use feature".
359
360           Excepting those listed above, we're currently unable to guarantee
361           that B::Deparse will produce a pragma at the correct point in the
362           program.  (Specifically, pragmas at the beginning of a block often
363           appear right before the start of the block instead.)  Since the
364           effects of pragmas are often lexically scoped, this can mean that
365           the pragma holds sway over a different portion of the program than
366           in the input file.
367
368       •   In fact, the above is a specific instance of a more general
369           problem: we can't guarantee to produce BEGIN blocks or "use"
370           declarations in exactly the right place.  So if you use a module
371           which affects compilation (such as by over-riding keywords,
372           overloading constants or whatever) then the output code might not
373           work as intended.
374
375       •   Some constants don't print correctly either with or without -d.
376           For instance, neither B::Deparse nor Data::Dumper know how to print
377           dual-valued scalars correctly, as in:
378
379               use constant E2BIG => ($!=7); $y = E2BIG; print $y, 0+$y;
380
381               use constant H => { "#" => 1 }; H->{"#"};
382
383       •   An input file that uses source filtering probably won't be deparsed
384           into runnable code, because it will still include the use
385           declaration for the source filtering module, even though the code
386           that is produced is already ordinary Perl which shouldn't be
387           filtered again.
388
389       •   Optimized-away statements are rendered as '???'.  This includes
390           statements that have a compile-time side-effect, such as the
391           obscure
392
393               my $x if 0;
394
395           which is not, consequently, deparsed correctly.
396
397               foreach my $i (@_) { 0 }
398             =>
399               foreach my $i (@_) { '???' }
400
401       •   Lexical (my) variables declared in scopes external to a subroutine
402           appear in coderef2text output text as package variables.  This is a
403           tricky problem, as perl has no native facility for referring to a
404           lexical variable defined within a different scope, although
405           PadWalker is a good start.
406
407           See also Data::Dump::Streamer, which combines B::Deparse and
408           PadWalker to serialize closures properly.
409
410       •   There are probably many more bugs on non-ASCII platforms (EBCDIC).
411

AUTHOR

413       Stephen McCamant <smcc@CSUA.Berkeley.EDU>, based on an earlier version
414       by Malcolm Beattie <mbeattie@sable.ox.ac.uk>, with contributions from
415       Gisle Aas, James Duncan, Albert Dvornik, Robin Houston, Dave Mitchell,
416       Hugo van der Sanden, Gurusamy Sarathy, Nick Ing-Simmons, and Rafael
417       Garcia-Suarez.
418
419
420
421perl v5.38.2                      2023-11-30                   B::Deparse(3pm)
Impressum