Perl でモジュールを使用する際は
use モジュール名;
で使用しますが、この時 Perl は特殊配列 @INC に格納されたパスに対してモジュールの探索を行います。
では、@INC に格納されていないパスにモジュールを置く場合はどうすれば良いでしょうか。単に push などで @INC に自分がモジュールを置くパスを表す要素を追加しただけでは期待した動作を行いません。なぜなら、push などの命令は Perl 実行時に行われますが、モジュールはコンパイル時に読み込みに行くからです。
いくつか方法がありますが、もっとも使いやすいのは下のように lib を使う方法じゃないでしょうか。
use lib "モジュールのパス";
モジュールのパスは LIST で与えることもできます。まあ、やってることは BEGIN を使ってコンパイル時に @INC に引数を unshift してるだけっぽいんで自分で BEGIN ルーチン書いちゃってもいいわけだけど。
ちなみに use lib の引数として与えるモジュールのパスですが、変数で与えことは出来ません。変数は実行時に評価されるもの。use はコンパイル時に評価するもの。だから。