Karen Etheridge > Devel-REPL-1.003028 > Devel::REPL::Overview


Annotate this POD



New  6
Open  19
Stalled  2
View/Report Bugs


Devel::REPL::Overview - overview of Devel::REPL.


What is a console? How it can assist you?

Most modern languages have consoles. The console is an interactive tool that evaluates your input while you type it. It gives you several advantages:

For Ruby it would be irb, for Python is... python by itself and for perl... and there was nothing for perl (except that ugly perl -d -e "" and several failed projects) until Devel::REPL was written by Matt S Trout (a.k.a. mst) from ShadowCatSystems http://www.shadowcatsystems.co.uk.

Devel::REPL - the Perl console

REPL stands for Read, Evaluate, Print, Loop. Lets install and try it.

       $ cpan Devel::REPL

After installation you have a lot of new modules, but the most interesting things are:

And a bunch of plugins (I'll describe them later). In command line type:

      $ re.pl

If everything is ok you'll see a prompt (underlined $). That's it. You can start typing expressions.

An example session:

  $ sub factorial {

  > my $number = shift;

  > return $number > 1 ? $number * factorial($number-1) : $number;

  > }

  $ factorial 1 # by the way, comments are allowed

  1 # our return value

  $ factorial 5


  $ [1,2,3,4,5,6,7]
  $ARRAY1 = [
              3, # return values are printed with Data::Dumper::Streamer.
              4, # See Plugins section

  $ {apple=>1,fruit=>'apple',cart=>['apple','banana']}
  $HASH1 = {
            apple => 1,
            cart  => [
            fruit => 'apple'

  $ package MyPackage; # create a package

  $ sub say_hi { # define a sub

  > print "Hi!\n";

  > } # statement is evaluated only after we've finished typing block.
      # See Plugins section.
  > __PACKAGE__
  > package main;

  > __PACKAGE_
  > MyPackage->say_hi

Control files a.k.a. I don't want to type it every time

Devel::REPL has a control files feature. Control files are evaluated on session start in the same way as you would type them manually in the console.

The default control file is located at $HOME/.re.pl/repl.rc.

You can store there any statements you would normally type in.

I.e. my $HOME/.re.pl/repl.rc has next lines:

      use feature 'say'; # to don't write \n all the time

      use Data::Dumper;

      # pretty print data structures
      sub pp { print Data::Dumper->Dump([@_]) }

You can have multiple control files and they can be anywhere in the file system. To make re.pl use some rc-file other than repl.rc, call it like this:

      $ re.pl --rcfile /path/to/your/rc.file

If your rc-file is in $HOME/.re.pl directory, you can omit the path:

      $ re.pl --rcfile rc.file

If you have rc-file with the same name in current directory and you don't want to type path, you can:

      $ re.pl --rcfile ./rc.file

I want it to bark, fly, jump and swim! or Plugins

Plugins extend functionality and change behavior of Devel::REPL. Bundled plugins are:

There are lots of contributed plugins you can find at CPAN.

Profiles ^

If plugins change and extend functionality of Devel::REPL, profiles are changing your environment (loaded plugins, constants, subs and etc.).

For example, the Minimal profile, Devel::REPL::Profile::Minimal:

      package Devel::REPL::Profile::Minimal;

      use Moose; ### advanced OOP system for Perl

      ### keep those exports/imports out of our namespace
      use namespace::autoclean;

      with 'Devel::REPL::Profile';  ## seem perldoc Muse

      sub plugins { ### plugins we want to be loaded
        qw(History LexEnv DDS Packages Commands MultiLine::PPI);

      ### the only required sub for profile,
      ### it is called on profile activation
      sub apply_profile {
        my ($self, $repl) = @_;
        ### $self - no comments, $repl - current instance of Devel::REPL

        $repl->load_plugin($_) for $self->plugins; ### load our plugins


There is also the StandardDevel::REPL::Profile::Standard profile, which contains a number of optional (yet very useful) features.

To enable some profile use the --profile switch:

      $ re.pl --profile SomeProfile

Alternatively, you can set the environment variable DEVEL_REPL_PROFILE to SomeProfile, or set the profile key in your rcfile (see Devel::REPL for more information).


syntax highlighting: