Re: Is there an interactive shell for gtk-perl
- From: "Ye Wenbin" <wenbinye gmail com>
- To: "gtk-perl-list gnome org" <gtk-perl-list gnome org>
- Subject: Re: Is there an interactive shell for gtk-perl
- Date: Fri, 27 Jul 2007 15:24:22 +0800
I just write one. I would like to share it with others who also want this.
#! /usr/bin/perl -w
package Gtksh::Subs;
use Data::Dumper qw(Dumper);
sub reload {
my $mod = shift;
(my $file = $mod) =~ s/::/\//g;
delete $INC{$file.".pm"};
eval("{
require $mod;
1;
}");
if ( $@ ) {
print "Reload $mod failed: $ \n";
} else {
print "Successfully reload $mod\n";
}
}
sub Dump {
print Data::Dumper::Dumper(@_), "\n";
}
sub help {
use Pod::Perldoc;
my $kw = shift;
print `perldoc $kw`;
}
package main;
use Getopt::Long qw(:config no_ignore_case auto_help);
use Gtk2 '-init';
use Glib qw(TRUE FALSE);
{
no warnings qw(all);
*x = \&Gtksh::Subs::Dump;
*reload = \&Gtksh::Subs::reload;
}
our $DEBUG = 0;
our $PROMPT = "gtksh> ";
my $start_up;
GetOptions(
'debug' => \$DEBUG,
'prompt=s' => \$PROMPT,
'start-up=s' => \$start_up,
);
print "This is a simple perl shell for gtk-perl!\n";
if ( defined $start_up && -f $start_up ) {
print "Load $start_up...\n";
require $start_up;
}
# Turn all buffering off.
select((select(STDOUT), $| = 1)[0]);
select((select(STDERR), $| = 1)[0]);
select((select(STDIN), $| = 1)[0]);
print $PROMPT;
Glib::IO->add_watch (fileno(STDIN), [qw/in/], \&watch_callback, \*STDIN);
Gtk2->main;
# make shell prompt print next line
END {
print "\n";
}
sub watch_callback {
my ($fd, $condition, $fh) = @_;
# internal variable, strange name so that you seldom change them
my $__exp__ = "";
my $__line__;
while (1) {
$__line__ = <$fh>;
unless (defined($__line__)) {
exit;
}
chomp($__line__);
if ($__line__ =~ s/\\\s*$//) {
print "+> ";
$__exp__ .= $__line__ . "\n";
} else {
last;
}
}
$__exp__ .= $__line__ . "\n";
print "\nYou just input: $__exp__\n" if $DEBUG;
if ($__exp__ =~ /^(quit|exit|bye)$/) {
exit;
} elsif ( $__exp__ =~ /^(help\s+|\?)(.*)\s*$/ ) {
Gtksh::Subs::help($2);
} else {
print "Eval '$__exp__'\n" if $DEBUG;
my $res = eval(
"{
no warnings 'all';
$__exp__;
}"
);
if ($@) {
print "Error: $ \n";
}
print "\nResult: ", $res, "\n" if defined $res;
}
print $PROMPT;
return TRUE;
}
__END__
=head1 NAME
gtksh.pl - A simple perl shell for gtk-perl
=head1 SYNOPSIS
gtksh.pl
=head1 DESCRIPTION
gtksh.pl is intended to be a perl shell which is better than `perl -d`.
I use this program in emacs, and it works, but not powerful.
=head2 Predefined command
=over
=item x
A alias for C<Data::Dumper::Dumper>. for example:
perl> $foo = {'a' => 1}
Result: HASH(0x837c674)
perl> x $foo
$VAR1 = {
'a' => 1
};
=item ?
=item help
Intend for replace input `perldoc` in this program. for example:
perl> help -f print
print FILEHANDLE LIST
print LIST
print Prints a string or a list of strings. Returns true if...
perl> help Math::Trig
NAME
Math::Trig - trigonometric functions
SYNOPSIS
...
=item reload
Reload a module again. Equal to eval "do($INC{Module.pm}". for example:
perl> require DBI
Result: 1
perl> reload "DBI"
Subroutine DBI::SQL_UDT redefined at /usr/lib/perl5/DBI.pm line 154,
<STDIN> line 2.
....
=item bye
=item exit
=item quit
Quit the program.
=back
=head1 AUTHOR
Ye Wenbin <wenbinye gmail com>
=head1 SEE ALSO
http://www.emacswiki.org/cgi-bin/emacs/inf-perl.el
=cut
--
Best regards,
Ye Wenbin
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]