use libと@INC

通常ライブラリパスは、use libで指定するかと思いますが、環境変数や引数によって読み込むライブラリパスを切り替えたいということがあります。

#!/usr/bin/perl

BEGIN {
  if ($ENV{APL_ENV} eq 'production') {
    use lib 'production/lib';
  } elsif ($ENV{APL_ENV} eq 'test') {
    use lib 'test/lib';
  } else {
    use lib 'development/lib';
  }
  use XXX;
}

としても、環境変数APL_ENVによってライブラリパスを切り替えることはできません。
上の例の場合、常にdevelopment/libのライブラリが使われます。これはuse libがBEGINブロックとして実行されるため、if文が効かないためです。こんな時は、

#!/usr/bin/perl

BEGIN {
  if ($ENV{APL_ENV} eq 'production') {
    unshift(@INC, 'production/lib');
  } elsif ($ENV{APL_ENV} eq 'test') {
    unshift(@INC, 'test/lib');
  } else {
    unshift(@INC, 'development/lib');
  }
  use XXX;
}

と@INCを直接操作してやることで、環境切り分けができます。