http://qs321.pair.com?node_id=606171

Look mum, no -M
$ perll -le 'print Dev::Bollocks->rand' apprehensively repurpose essential meta-services
# bash alias alias perll="perl -MClass::Autouse=:superloader"
Adding automatic installation is an exercise for the reader

Replies are listed 'Best First'.
Re: Shorten one liners with Class::Autouse
by xdg (Monsignor) on Mar 23, 2007 at 14:09 UTC

    Interesting approach. Personally, I shorten one-liners by preloading common modules using a custom ToolSet.

    package XDG; our $VERSION = "0.02"; use base 'ToolSet'; ToolSet->set_strict(1); ToolSet->set_warnings(1); ToolSet->export( 'Carp' => 'carp croak confess', 'Data::Dump::Streamer' => undef, 'File::Spec' => undef, 'Perl6::Say' => 'say', 'Scalar::Util' => 'refaddr reftype blessed', ); 1; # true

    Used like this:

    perl -MXDG -e 'say "Loaded modules:" and Dump \%INC'

    -xdg

    Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Re: Shorten one liners with Class::Autouse
by Limbic~Region (Chancellor) on Mar 23, 2007 at 12:47 UTC
    bsb,
    How does this make the one liner shorter? Isn't '->' the same length as '-M'? If I wanted to use more than one exported function (or the same function more than once) from Foo::Bar wouldn't this actually make the 1 liner longer?
    perll -e 'print Foo::Bar->blah()' perl -MFoo::Bar -e 'print blah()' perll -e 'print Foo::Bar->blah(), Foo::Bar->asdf()' perl -MFoo::Bar -e 'print blah(), asdf()'
    I admit that using a one liner is extremely rare for me and I am likely missing something. Would you mind giving a more detailed explanation of how this helps or is it just "cool"?

    Cheers - L~R

      It depends on the module, if Foo::Bar exports a procedural interface by default then it won't shorten anything. If it optionally exports functions then you have to type them in the export list (-MFoo::Bar=blah,asdf) in addition to the code.

      Dev::Bollocks doesn't export anything so you'd need to repeat the module name:

      perl -MDev::Bollocks -le 'print Dev::Bollocks->rand()' perll -le 'print Dev::Bollocks->rand()'
      I often use one liners like this to test drive a module, sometimes to filter things (eg. with Email::Valid). I expect that the -MSome::Long::Name -e '$s=Some::Long::Name->new()' type scripts will shrink nicely.

      BTW, I've only just started using this alias so I don't have a much of feel for it yet...

Re: Shorten one liners with Class::Autouse
by bsb (Priest) on Mar 30, 2007 at 08:13 UTC
    A vaguely related footnote:

    Ending a module with __PACKAGE__; instead of the usual 1; could be used to call a method on the result of the require.

    $ cat Eg.pm package Eg; sub hello { print "Hello World\n"; } __PACKAGE__; $ perl -e '(require Eg)->hello()' Hello World