SYNOPSYS
use Shell::Perl; Shell::Perl->run_with_args;
DESCRIPTION
This is the implementation of a command-line interpreter for Perl. I wrote this because I was tired of using irb when needing a calculator with a real language within. Ah, that and because it was damn easy to write it.This module is the heart of the pirl script provided with Shell-Perl distribution, along with this module.
EXAMPLE SESSION
$ pirl Welcome to the Perl shell. Type ':help' for more information pirl @> 1+1 2 pirl @> use YAML qw(Load Dump); () pirl @> $data = Load("--- { a: 1, b: [ 1, 2, 3] }\n"); { a => 1, b => [1, 2, 3] } pirl @> $var = 'a 1 2 3'; $var =~ /(\w+) (\d+) (\d+)/ ("a", 1, 2) pirl @> :q
COMMANDS
Most of the time, the shell reads Perl statements, evaluates them and outputs the result.There are a few commands (started by ':') that are handled by the shell itself.
- :h(elp)
- Handy for remembering what the shell commands are.
- :q(uit)
-
Leave the shell. The Perl statement "exit" will work too.
SYNONYMS: :exit, :x
- :set out (D|DD|DDS|Y|P)
-
Changes the dumper for the expression results used before
output. The current supported are:
-
- D
- "Data::Dump"
- DD
- "Data::Dumper", the good and old core module
- DDS
- "Data::Dump::Streamer"
- Y
- "YAML"
- P
- a plain dumper (``$ans'' or ``@ans'')
-
When creating the shell, the dump format is searched among the available ones in the order ``D'', ``DD'', ``DDS'', ``Y'' and ``P''. That means Data::Dump is preferred and will be used if available/installed. Otherwise, Data::Dumper is tried, and so on.
Read more about dumpers at Shell::Perl::Dumper.
-
- :set ctx (scalar|list|void|s|l|v|$|@|_)
-
Changes the default context used to evaluate the entered expression.
The default is 'list'.
Intuitively, 'scalar', 's' and '$' are synonyms, just like 'list', 'l', and '@' or 'void', 'v', '_'.
There is a nice way to override the default context in a given expression. Just a '#' followed by one of 'scalar|list|void|s|l|v|$|@|_' at the end of the expression.
pirl @> $var = 'a 1 2 3'; $var =~ /(\w+) (\d+) (\d+)/ ("a", 1, 2) pirl @> $var = 'a 1 2 3'; $var =~ /(\w+) (\d+) (\d+)/ #scalar 1
- :reset
- Resets the environment, erasing the symbols created at the current evaluation package. See the section ``ABOUT EVALUATION''.
METHODS
Remember this is an alpha version, so the API may change and that includes the methods documented here. So consider this section as implementation notes for a while.In later versions, some of these information may be promoted to a public status. Others may be hidden or changed and even disappear without further notice.
- new
-
$sh = Shell::Version->new;
The constructor.
- run_with_args
-
Shell::Perl->run_with_args;
Starts the read-eval-print loop after reading options from @ARGV. It is a class method.
If an option -v or --version is provided, instead of starting the REPL, it prints the script identification and exits with 0.
$ pirl -v This is pirl, version 0.0017 (bin/pirl, using Shell::Perl 0.0017)
- run
-
$sh->run;
The same as "run_with_args" but with no code for interpreting command-line arguments. It is an instance method, so that "Shell::Perl-"run_with_args> is kind of:
Shell::Perl->new->run;
- eval
-
$answer = $sh->eval($exp); @answer = $sh->eval($exp);
Evaluates the user input given in $exp as Perl code and returns the result. That is the 'eval' part of the read-eval-print loop.
-
$sh->print(@args);
Prints a list of args at the output stream currently used by the shell.
- help
-
$sh->help;
Outputs the help as provided by the command ``:help''.
- reset
-
$sh->reset;
Does nothing by now, but it will.
- dump_history
-
$sh->dump_history(); $sh->dump_history($file);
Prints the readline history to "STDOUT" or the optional file. Used to implement experimental command ``:dump history''.
This is experimental code and should change in the future. More control should be added and integrated with other terminal features.
- set_ctx
-
$sh->set_ctx($context);
Assigns to the current shell context. The argument must be one of " ( 'scalar', 'list', 'void', 's', 'l', 'v', '$', '@', '_' ) ".
- set_package
-
$sh->set_package($package);
Changes current evaluation package. Doesn't change if the new package name is malformed.
- set_out
-
$sh->set_out($dumper);
Changes the current dumper used for printing the evaluation results. Actually must be one of ``D'' (for Data::Dump), ``DD'' (for Data::Dumper), ``DDS'' (for Data::Dump::Streamer), ``Y'' (for YAML) or ``P'' (for plain string interpolation).
- prompt_title
-
$prompt = $sh->prompt_title;
Returns the current prompt which changes with executable name and context. For example, ``pirl @>'', ``pirl $>'', and ``pirl >''.
- quit
-
$sh->quit;
This method is invoked when these commands and statements are parsed by the REPL:
:q :quit :x :exit quit exit
It runs the shutdown procedures for a smooth termination of the shell. For example, it saves the terminal history file.
GORY DETAILS
ABOUT EVALUATION
When the statement read is evaluated, this is done at a different package, which is "Shell::Perl::sandbox" by default.So:
$ perl -Mlib=lib bin/pirl Welcome to the Perl shell. Type ':help' for more information pirl @> $a = 2; 2 pirl @> :set out Y # output in YAML pirl @> \%Shell::Perl::sandbox:: --- BEGIN: !!perl/glob: PACKAGE: Shell::Perl::sandbox NAME: BEGIN a: !!perl/glob: PACKAGE: Shell::Perl::sandbox NAME: a SCALAR: 2
This package serves as an environment for the current shell session and :reset can wipe it away.
pirl @> :reset pirl @> \%Shell::Perl::sandbox:: --- BEGIN: !!perl/glob: PACKAGE: Shell::Perl::sandbox NAME: BEGIN
TO DO
There is a lot to do, as always. Some of the top priority tasks are:- Accept multiline statements;.
- Refactor the code to promote easy customization of features.
BUGS
It is a one-line evaluator by now.I don't know what happens if you eval within an eval. I don't expect good things to come. (Lorn who prodded me about this will going to find it out and then I will tell you.)
There are some quirks with Term::Readline (at least on Windows).
There are more bugs. I am lazy to collect them all and list them now.
Please report bugs via CPAN RT <http://rt.cpan.org/NoAuth/Bugs.html?Dist=Shell-Perl> or <mailto://[email protected]>.
COPYRIGHT AND LICENSE
Copyright (C) 2007X2011 by Adriano R. FerreiraThis library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.