Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

chomping the output of Shell.pm

by LanX (Canon)
on Sep 08, 2012 at 20:23 UTC ( #992526=perlquestion: print w/ replies, xml ) Need Help??
LanX has asked for the wisdom of the Perl Monks concerning the following question:

hi im using use Shell qw/commands/ in my perldebugger config to have some handy shell commands while interacting with the OS. Unfortunately the newlines are a bit disturbing,
DB<109> pwd => "/tmp\n"
any clever suggestions how to automatically chomp them? At the moment I'm doing it with a brute force wrapper like
my $old= \&pwd; my $new= sub { chomp( my @ret=$old->(@_) ); return @ret }; *pwd=$new;
DB<114> pwd => "/tmp"
Anything better? Should be as lightweight as possible...

Cheers Rolf

Comment on chomping the output of Shell.pm
Select or Download Code
Re: chomping the output of Shell.pm
by Anonymous Monk on Sep 08, 2012 at 21:35 UTC

    any clever suggestions how to automatically chomp them?

    Modify Shell.pm to accept  { autochomp => [qw[ commands ]] }

Re: chomping the output of Shell.pm
by kcott (Abbot) on Sep 09, 2012 at 05:11 UTC

    G'day Rolf,

    Update: I posted a solution but later found it didn't work with commands that output multiple lines (e.g. ls, ps, etc.). Here's a new solution that doesn't have that problem. The original also had a portability issue: this one doesn't. (The spoiler below contains the original solution.)

    My .perldb contains:

    $ cat ~/.perldb for (qw{pwd date ls ps}) { $DB::alias{$_} = 's{^($_.*)$}{chomp(my $out = qx{$1}); print {$DB::OUT} $out} +e'; }

    Obviously, substitute qw{pwd date ls ps} with your qw/commands/. See perldebug - Debugger Customization for a description of %DB::alias.

    Here's a test run:

    $ perl -d -e 1 Loading DB routines from perl5db.pl version 1.33 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. main::(-e:1): 1 DB<1> pwd /Users/ken/tmp DB<2> date Sun 9 Sep 2012 18:12:43 EST DB<3> date "%Y-%m-%d" date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS +]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] DB<4> date "+%Y-%m-%d" 2012-09-09 DB<5> ls -l total 30824 ... drwxr-xr-x 7 ken staff 238 14 Jun 20:23 zip_test DB<6> ps -ef UID PID PPID C STIME TTY TIME CMD ... 501 74528 74527 0 23Aug12 ttys007 0:00.04 -bash DB<7> q $

    The typo (date "%Y-%m-%d") was accidental but I left it in just to show that the mistake was handled in a reasonable fashion.

    -- Ken

      Hi Ken,

      thanks for your solution, but I wanna use those functions in any place not only at start of line.

      e.g.

      rm grep {/.pl$/} ls

      If you wanna implement (start of line) aliases, you should simply us "!!"

      DB<112> =du !!du DB<113> du /tmp 8 /tmp/pulse-lanx 4 /tmp/virtual-lanx.AqXwcf ... DB<114> $DB::alias{du} => "s\adu\a!!du\a"

      !! cmd Run cmd in a subprocess (reads from DB::IN, writes to DB:: +OUT) See 'O shellBang' too.

      Cheers Rolf

      ) Yes I could use the file-glob <*> instead, but this is only an example for chaining commands

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://992526]
Approved by Old_Gray_Bear
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2014-09-20 05:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (153 votes), past polls