[pm-h] madness, genius or confusion?

Lanny Ripple lanny.ripple at gmail.com
Wed Mar 14 09:11:37 PDT 2012


I vote confusion.

Programming Perl says that

  use Module LIST;

is exactly equivalent to

  BEGIN {
    require "Module.pm";
    Module->import(LIST);
  }

So the code below is going to act like

  BEGIN {
    eval "{
      BEGIN {
        require "lib.pm";
        lib->import('/usr/prod/xxx/xxx/perl/lib/');
        }
      }"
  }

Now `use lib path' just adds F<path> to the module search path.  Perl will start running, byte compile the script, and execute BEGIN sections.  In this section it will find an eval so will byte compile the string and execute it.  The final result will be indistinguishable from

  use lib '/usr/prod/xxx/xxx/perl/lib/';

apart from the above simpler form perhaps taking a (humanly) un-noticable shorter time to run since there's not the runtime string eval involved.

To beat this dead horse a touch more had the eval not been in quotes the byte compilation would have happened at the same time as the main script and would basically be a no-op.

  $0.02,
  -ljr


On Mar 14, 2012, at 10:44 AM, Bryan Rivera wrote:

> Has anyone ever seen something like the code snippet below? I came
> across this and figured I was just missing something. Why would you
> want to 'use lib' inside an eval inside a BEGIN block? I think it's
> all kinds of wrong.
> 
> BEGIN {
>    eval "{ use lib '/usr/prod/xxx/xxx/perl/lib/'; }";
> }
> 
> -Bry
> _______________________________________________
> Houston mailing list
> Houston at pm.org
> http://mail.pm.org/mailman/listinfo/houston
> Website: http://houston.pm.org/



More information about the Houston mailing list