基本的なことで申し訳ないですが、質問です
A.pl、B.pm、C.pm、D.plとあって、全て同じディレクトリにおいています。
@INCには、Aの先頭で、use libで絶対パスを入れています。
AはBを「use B」しています。BはCを継承(use C かつ @ISA)しています。
BとCは、Dを「require 'D.pl'」しています。
この状態で、Aを./A.plで起動し、Bの関数をコールします。
Bはそのコールされた関数から、D内部の関数をコールしますが、見つからないと怒られます
しかし、Bが継承したCの関数をAからコール、または、B内部でCの関数をコールした場合
そのコールされたCの関数からは、D内部の関数がちゃんと見つかるようです
これはなぜなのでしょうか?
また、Bでの「require 'D.pl'」を「require './D.pl'」または
「require '/xxx/xxx/D.pl'」のように変更すると
BからもDの関数がみえるようです。
これも疑問です。

そもそも問題は関数が見えないことだったので
DをD.pmに変更し、BとCのrequireをuseに変えて
D内部でExpoterすることで対処しています。
問題は解決していますが?、出来れば上記の疑問を
解消するためのヒントなりをいただければと思います。