1Devel::REPL::Overview(3U)ser Contributed Perl DocumentatiDoenvel::REPL::Overview(3)
2
3
4
6 Devel::REPL::Overview - overview of Devel::REPL.
7
9 What is a console? How it can assist you?
10 Most modern languages have consoles. Console is an interactive tool
11 that evaluates your input while you type it.
12 It gives you several advantages:
13
14 · Quickly test some thought or tricky expression
15
16 · Run some code bigger than one line without a temporary file
17
18 · Play around with libraries and modules
19
20 · You can even call a console in your script and play around in
21 script's context
22
23 For Ruby it would be irb, for Python is... python byitself and for
24 perl... and there was nothing for perl (except that ugly perl -d -e ""
25 and several failed projects) until Devel::REPL was written by Matt S
26 Trout (a.k.a. mst) from ShadowCatSystems
27 <http://www.shadowcatsystems.co.uk>.
28
29 Devel::REPL - the Perl console
30 REPL stands for Read, Evaluate, Print, Loop. Lets install and try it.
31
32 $ cpan Devel::REPL
33
34 After installation you have a lot of new modules, but the most
35 interesting things are:
36
37 · Devel::REPL
38 A top level module.
39
40 · re.pl
41 Wrapper script, running console.
42
43 And a bunch of plugins (I'll describe them later). In command line
44 type:
45
46 $ re.pl
47
48 If everything is ok you'll see a prompt (underlined $). That's it. You
49 can start typing expressions.
50
51 An example session:
52
53 $ sub factorial {
54
55 > my $number = shift;
56
57 > return $number > 1 ? $number * factorial($number-1) : $number;
58
59 > }
60
61 $ factorial 1 # by the way, comments are allowed
62
63 1 # our return value
64
65 $ factorial 5
66
67 120
68
69 $ [1,2,3,4,5,6,7]
70 $ARRAY1 = [
71 1,
72 2,
73 3, # return values are printed with Data::Dumper::Streamer.
74 4, # See Plugins section
75 5,
76 6,
77 7
78 ];
79
80 $ {apple=>1,fruit=>'apple',cart=>['apple','banana']}
81 $HASH1 = {
82 apple => 1,
83 cart => [
84 'apple',
85 'banana'
86 ],
87 fruit => 'apple'
88 };
89
90 $ package MyPackage; # create a package
91
92 $ sub say_hi { # define a sub
93
94 > print "Hi!\n";
95
96 > } # statement is evaluated only after we've finished typing block.
97 # See Plugins section.
98 > __PACKAGE__
99 MyPackage
100 > package main;
101
102 > __PACKAGE_
103 main
104 > MyPackage->say_hi
105 Hi!
106 1
107 $
108
109 Control files a.k.a. I don't want to type it every time
110 Devel::REPL has control files feature. Control files are evaluated on
111 session start in the same way as you would type them manually in
112 console.
113
114 Default control file is located at `$HOME/.re.pl/repl.rc` .
115
116 You can store there any statements you would normally type in.
117
118 I.e. my `$HOME/.re.pl/repl.rc` has next lines:
119
120 use feature 'say'; # to don't write \n all the time
121
122 use Data::Dumper;
123
124 # pretty print data structures
125 sub pp { print Data::Dumper->Dump([@_]) }
126
127 You can have multiple control files and they can be anywhere in the
128 file system. To make re.pl use some rc-file other than repl.rc call it
129 like this:
130
131 $ re.pl --rcfile /path/to/your/rc.file
132
133 If your rc-file is in `$HOME/.re.pl` directory, you can omit path:
134
135 $ re.pl --rcfile rc.file
136
137 If you have rc-file with the same name in current directory and you
138 don't want to type path, you can:
139
140 $ re.pl --rcfile ./rc.file
141
142 I want it to bark, fly, jump and swim! or Plugins
143 Plugins extend functionality and change behavor of Devel::REPL.
144 Bundled plugins are:
145
146 · Devel::REPL::Plugin::History
147 No comments. Simply history.
148
149 · Devel::REPL::Plugin::!LexEnv
150 Provides a lexical environment for the Devel::REPL.
151
152 · Devel::REPL::Plugin::DDS
153 Formats return values with Data::Dump::Streamer module.
154
155 · Devel::REPL::Plugin::Packages
156 Keeps track of which package your're in.
157
158 · Devel::REPL::Plugin::Commands
159 Generic command creation plugin using injected functions.
160
161 · Devel::REPL::Plugin::MultiLine::PPI
162 Makes Devel::REPL read your input until your block
163 is finished. What does this means: you can type a part of a block
164 on one line and second part on another:
165
166 $ sub mysub {
167
168 > print "Hello, World!\n"; ## notice prompt change
169
170 > }
171
172 $ mysub
173 Hello, World!
174 1
175 $
176
177 but this *doesn't* mean you can print sub name or identifier
178 on several lines. Don't do that! It won't work.
179
180 There are lots of contributed plugins you can find at CPAN.
181
183 If plugins change and extend functionality of Devel::REPL, profiles are
184 changing your environment (loaded plugins, constants, subs and etc.).
185
186 There's only one bundled profile called
187 `Devel::REPL::Profile::Default`, lets take a look at it:
188
189 package Devel::REPL::Profile::Default;
190
191 use Moose; ### advanced OOP system for Perl
192
193 ### keep those exports/imports out of our namespace
194 use namespace::clean -except => [ 'meta' ];
195
196 with 'Devel::REPL::Profile'; ## seem perldoc Muse
197
198 sub plugins { ### plugins we want to be loaded
199 qw(History LexEnv DDS Packages Commands MultiLine::PPI);
200 }
201
202 ### the only required sub for profile,
203 ### it is called on profile activation
204 sub apply_profile {
205 my ($self, $repl) = @_;
206 ### $self - no comments, $repl - current instance of Devel::REPL
207
208 $repl->load_plugin($_) for $self->plugins; ### load our plugins
209 }
210
211 1;
212
213 At the moment there are no profiles on CPAN. Mostly you'll use control
214 files. To enable some profile use --profile switch:
215
216 $ re.pl --profile SomeProfile
217
219 Devel::REPL, Devel::REPL::Plugin, Devel::REPL::Profile
220
221
222
223perl v5.12.1 2010-05-23 Devel::REPL::Overview(3)