lib_file#

Return a one-line description of when and with what the interpreter was built.

Synopsis#

use Config;
print Config::compile_date(), "\n";

What you get back#

A string such as Compiled at Oct  8 2026 20:41:20: when this pperl binary was built, in the layout perl uses, which Config::Perl::V and similar tools parse. pperl -V prints the same line. The compiler that built it is $Config{ccversion} and friends.

Say under which path this interpreter sees a library file.

Synopsis#

use Config;
my $path = Config::lib_file("strict.pm");
my $path = Config::lib_file("ExtUtils/typemap");
my $path = Config::lib_file("Foo/Bar.pm", \@dirs);

What you get back#

The path of the file a require of that name would load, or undef when there is none. The name is a path below a library directory, with / between the parts, as in %INC. The path can be opened.

A file that is part of the pperl binary is found first and reported as ./pperl-native/<name>: nothing on disk can take its place. Any other file is looked for in each directory of @INC in turn, and the first one that exists and is not a directory is reported.

With a second argument, a reference to an array of directories, those are searched in place of @INC. The pperl binary’s own files count only when ./pperl-native is among them.

A built-in module written in Rust has no Perl source. Opened under the path reported here it reads as three lines: its package, its $VERSION and a true value.

Why it exists#

Perl’s own way of asking is to walk @INC with -e or -r and take the first hit. The library inside the pperl binary can be opened but answers no file test, so that walk passes it by. A tool that must know where a module is, or which version would be loaded, asks here.

Examples#

use Config;
use ExtUtils::MakeMaker ();
my $file = Config::lib_file("List/Util.pm");
print MM->parse_version($file), "\n" if defined $file;