SPUG: September meeting question

Joshua ben Jore twists at gmail.com
Wed Nov 8 13:57:10 PST 2006


On 11/8/06, Paul Cook <ppcook at gmail.com> wrote:
> Here is what Josh ben Jore said in response to my same question:
>
> -------------------------
>
> On 10/29/06, Paul Cook <ppcook at gmail.com> wrote:
> > Thanks Josh. I'm a novice. What does dual-lifed mean?
>
>
> It lives soley in core perl right now but will be available separately
> on CPAN soon. This allows you to upgrade the module without upgrading
> perl.

So it's a nice thought but my home is full of boxes and I don't have
the computer with ~/src uncrated so I figure "soon" is pretty
relative. The latest B::Lint
(http://public.activestate.com/pub/apc/perl-current/ext/B/B/Lint.pm)
fixes it to work on threaded perls (that's the major bug, I think),
and adds some new stuff like making it use plugins.

I also make all uses of <> a warning because it's evil. Most people
should write linty things in Perl::Critic. Some things can't be done
in P::C because the interpreter has to compile the code first for it
to be sane (things like "does this function exist?" aren't possible in
P::C). When it's impossible in P::C, write it in B::Lint. The plugin
interface sucks right now though. It should use Module::Pluggable.

As an example, here's a plugin I wrote to find uses of C<sort { $a <
$b }> which occurred to someone else's co-worker and probably anyone
who is expecting something C++ like.

package B::Lint::Plugin::SortOperator;
use B::Lint;
B::Lint->register_plugin( __PACKAGE__ => [qw[ sort-operator ]] );
use List::MoreUtils 'any';

sub match {
   my $op = shift @_;

   return unless $op->isa( 'B::LISTOP' )
     and $op->name eq 'sort';

   # perl -MO=Concise -e 'print sort { $a < $b } @X'
   # (sort
   #    (pushmark) s ->5
   #    (null
   #       (scope
   #            (ex-nextstate)
   #            (lt
   #               (ex-rv2sv
   #                  (gvsv "a"))
   #               (ex-rv2sv
   #                (gvsv "b")))))
   #    (rv2av
   #       (gv "X")))
   my $comparison_op = eval { $op->first->sibling->first->first->sibling }
     or return;

   # <, >, lt, gt
   return unless $comparison_op->name =~ /^s?[lg]t\z/;

   B::Lint::warning( 'Invalid use of a comparison operator' );
}

Josh


More information about the spug-list mailing list