http://www.perlmonks.org?node_id=1008988


in reply to Re: Know a perl's -I flag from perl?
in thread Read a perl's -I flag from perl?

Hello,

You are very right Anoymous.

And I can accept the point of view that perl interpreter flags should not be controlled from perl source.

Actually I can imagine that there can be another kind of perl interpreter that can have the different flags an/or not to be a binary at all (e. g., a binary library) and it may not accept namely the -I flag.

But I think the task is quite straightforward to take those condireations not as seriously as I can.

It's all just about to run the binary from make test or prove.

I believe it's not a problem for you to suggest another way to supply the libraries path for perl binary to run from tests, if you have any.

Thank you.

Replies are listed 'Best First'.
Re^3: Know a perl's -I flag from perl?
by Anonymous Monk on Dec 16, 2012 at 00:21 UTC

    The purpose of -I is to populate @INC

    You don't need the original -I flags, you have @INC

      But @INC can be altered at run time. Consider that your default @INC is just:

      /eg/lib

      You run perl -I/eg/custom myscript.pl.

      Now @INC is:</c>

      /eg/custom /eg/lib

      Imagine that myscript.pl contains use mylibs which loads /eg/custom/mylibs.pm. This module itself tinkers with @INC at run-time, adding another path at the front.

      /corporate/lib /eg/custom /eg/lib

      Now you want to launch another Perl process via system(), so what do you do? Something like:

      my @incs = map { "-I$_" } @INC; system($^X, @incs, 'other-script.pl');

      So when the other script starts, it will start with this in @INC:

      /corporate/lib /eg/custom /eg/lib

      Now let's imagine that other-script.pl also does use mylibs. Rather than that loading /eg/custom/mylibs.pm, it might now load /corporate/lib/mylibs.pm, which is perhaps an older version of the mylibs package which behaves differently to how we wanted.

      Granted this is a rare situation, but there do exist packages along these lines; packages that exist entirely to manipulate @INC, such as local::lib. Combining these libraries with system($^X) can get you into a merry little pickle.

      perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

        ...

        So before your script diddles @INC, preserve it?

        use constant FINC => [ @INC ]; use lib ...;

        And if you're worried about that, then worry about PERLLIB/PERL5LIB/PERL5OPTS...