The path separator which CORE::require requires

require()に渡すパスセパレータは、OSに関わらず常にスラッシュ(/)でよい。というのも、require()は必要に応じてスラッシュ区切りのパスをOS固有の形式に変換するからである。つまり、require()に渡すパスを作成するためにわざわざFile::Specのようなモジュールを使う必要はない。
perldoc -f require

require EXPR
If EXPR is a bareword, the require assumes a ".pm" extension and replaces "::" with "/" in the filename for you, to make it easy to load standard modules.

逆に言えば、ネイティブWindowsシステム上でrequire()に与えるパスをバックスラッシュ(\)で区切らないほうがよい。特に普通のモジュールでそれをすると、下記のように%INCのキーの整合性が取れなくなり、同じモジュールを二度読み込んでしまう可能性がある*1

# on Win32/MinGW
require 'Foo\\Bar.pm'; # load && $INC{'Foo\\Bar.pm'}++
require Foo::Bar;      # load && $INC{'Foo/Bar.pm'}++

したがって、パッケージ名をパスに変換する処理は以下のような単純なやりかたで十分移植性がある。

sub package_to_file {
    my($name) = @_;
    $name =~ s{::}{/}g;
    return "$name.pm";
}

*1:このことをバグだと考える人もいる。参考:http://rt.perl.org/rt3/Public/Bug/Display.html?id=19213