NAME

App::Pebble - Unix like streams, but with objects instead of lines of text

DESCRIPTION

The Unix idea of a stream of lines, on steroids.

Note: This is alpha, pure R&D at this stage; just trying out a good way to do things.

SYNOPSIS

Work with lines of text

  # pgrep, pn: Filter out POD lines, add a \n
  cat lib/App/Pebble.pm | pebble 'pgrep { /^=/ } | pn'
  =head1 NAME
  =head1 SYNOPSIS
  =head1 DESCRIPTION
  ...

  # The same, limit output to 2 lines
  cat lib/App/Pebble.pm | p 'pgrep { /^=head/ } | plimit 2 | pn'
  =head1 NAME
  =head1 SYNOPSIS

Work with objects

  # P->match: Parse matching lines into objects with named attributes.
  # The default output format is one-line JSON.
  cat lib/App/Pebble.pm | \
  p 'P->match( regex => qr/^=head(\d+)\s+(.+)/, has => ["level", "text"] )'
  {"level":"1","text":"NAME"}
  {"level":"1","text":"SYNOPSIS"}
  {"level":"1","text":"DESCRIPTION"}
  ...

  ###TODO: split

  ###TODO: parsers

  # R->table: Do the same, but provide a Renderer (table) as the final stage
  cat lib/App/Pebble.pm | \
  p 'P->match( regex => qr/^=head(\d+)\s+(.+)/, has => ["level", "text"] ) | R->table'
  .-------------------------------.
  | level | text                  |
  +-------+-----------------------+
  |     1 | NAME                  |
  |     1 | SYNOPSIS              |
  |     1 | DESCRIPTION           |
  ...
  '-------+-----------------------'

  # --out=CSV: Do the same, but provide a CSV renderer on the command line,
  # not as the final stage.
  # You can install more renderers, and write your own.
  cat lib/App/Pebble.pm | \
  p --out=CSV 'P->match( regex => qr/^=head(\d+)\s+(.+)/, has => ["level", "text"] )'
  level,text
  1,NAME
  1,SYNOPSIS
  1,DESCRIPTION

Filtering objects

  # pgrep: Filter out headings with too long text
  cat lib/App/Pebble.pm | \
  p --out=table 'P->match( regex => qr/^=head(\d+)\s+(.+)/, has => ["level", "text"] )
  | pgrep { length( $_->text) < 5 }'
  .--------------.
  | level | text |
  +-------+------+
  |     1 | NAME |
  |     1 | BUGS |
  '-------+------'

Transforming objects

  # p / pmap: Shorten the text value to at most 5 chars
  # "pmap" is so commonly used it's aliased to "p" for convenience.
  # Note that you still want the object itself to be passed along in the stream,
  # so you need to end the block with $_;
  cat lib/App/Pebble.pm | p --out=table 'P->match( regex => qr/^=head(\d+)\s+(.+)/, has => ["level", "text"] ) | p { $_->text( substr($_->text, 0, 5 )); $_ }'
  .---------------.
  | level | text  |
  +-------+-------+
  |     1 | NAME  |
  |     1 | SYNOP |
  |     1 | DESCR |
  ...

###TODO: local variables

Work with predefined commands

  # --cmd=df: Run "df -k" and parse the output
  p --cmd=df --out=table 'plimit 2'
  .--------------------------------------------------------------------------.
  | available | blocks    | capacity | filesystem   | mounted_on | used      |
  +-----------+-----------+----------+--------------+------------+-----------+
  |  21856800 | 976101344 |       98 | /dev/disk0s2 | /          | 953732544 |
  |         0 |       216 |      100 | devfs        | /dev       |       216 |
  '-----------+-----------+----------+--------------+------------+-----------'

CLASS ATTRIBUTES

cache[ Cache::Cache | undef ]

Optional cache object, used for e.g. web requests.

METHODS

AUTHOR

Johan Lindstrom, <johanl at cpan.org>

BUGS

Please report any bugs or feature requests to bug-app-pebble at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=App-Pebble. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc App::Pebble

You can also look for information at:

ACKNOWLEDGEMENTS

LICENSE AND COPYRIGHT

Copyright 2010- Johan Lindstrom.

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.