Config::IniFiles(3pm)
β¨ NAME β¨
Config::IniFiles β a module for reading .ini-style configuration files. That's it, that's the whole girlie. π
π VERSION π
version 3.001000 β yes bestie, she's on version 3, she's been through some things, she's thriving. π
π¦ SYNOPSIS π¦
use Config::IniFiles;
my $cfg = Config::IniFiles->new( -file => "/path/configfile.ini" );
print "The value is " . $cfg->val( 'Section', 'Parameter' ) . "."
if $cfg->val( 'Section', 'Parameter' );
look at her go. one new, one val, and you're literally reading config. iconic behavior. β¨
πΈ DESCRIPTION πΈ
Config::IniFiles gives you a way to have readable configuration files that live outside your Perl script β like, your settings get their own little apartment instead of crashing on your script's couch. ποΈ
Configurations can be imported (inherited, stacked,β¦), sections can be grouped, and settings can be accessed from a tied hash. that's a lot of slay in one sentence, I know. π«Ά
π FILE FORMAT π
INI files consist of a number of sections, each preceded with the section name in square brackets, followed by parameter names and their values. like this:
[a section]
Parameter=Value
[section 2]
AnotherParameter=Some value
Setting=Something else
Parameter=Different scope than the one in the first section
see how Parameter shows up in both sections and it's a whole different girl each time? that's the point. π
π§ the rules, bestie
- The first non-blank character of the line indicating a section must be a left bracket and the last non-blank character of a line indicating a section must be a right bracket. π
- The characters making up the section name can be any symbols at all. go feral. however β section names must be unique. no duplicates, periodt.
- Parameters are specified in each section as
Name=Value. Any spaces around the equals sign will be ignored, and the value extends to the end of the line (including any whitespace at the end of the line). π - Parameter names are localized to the namespace of the section, but must be unique within a section.
- Both the hash mark (
#) and the semicolon (;) are comment characters, by default (this can be changed by configuration). Lines that begin with either of these characters will be ignored. Any amount of whitespace may precede the comment character. π€
π multi-line / multi-valued parameters
Multi-line or multi-valued parameters may also be defined ala UNIX "here document" syntax:
Parameter=<<EOT
value/line 1
value/line 2
EOT
You may use any string you want in place of "EOT". Note that whatever follows the "<<" and what appears at the end of the text MUST match exactly, including any trailing whitespace. π€ yes, even the sneaky invisible spaces. check them.
π continuation lines
Alternately, as a configuration option (default is off), continuation lines can be allowed:
[Section]
Parameter=this parameter \
spreads across \
a few lines
just sayin' β that's opt-in, not a default. π
π USAGE -- Object Interface π
Get a new Config::IniFiles object with the new method:
$cfg = Config::IniFiles->new( -file => "/path/config_file.ini" );
$cfg = new Config::IniFiles -file => "/path/config_file.ini";
Optional named parameters may be specified after the configuration file name. See the new in the METHODS section, below. π
Values from the config file are fetched with the val method:
$value = $cfg->val('Section', 'Parameter');
If you want a multi-line/value field returned as an array, just specify an array as the receiver:
@values = $cfg->val('Section', 'Parameter');
boom. scalar or list, your choice, she's flexible. π¦
π METHODS π
π new ( [-option=>value ...] )
Returns a new configuration object (or "undef" if the configuration file has an error, in which case check the global @Config::IniFiles::errors array for reasons why π). One Config::IniFiles object is required per configuration file. The following named parameters are available:
-filefilename β Specifies a file to load the parameters from. This 'file' may actually be any of the following things:- the pathname of a file
$cfg = Config::IniFiles->new( -file => "/path/to/config_file.ini" );
- a simple filehandle
$cfg = Config::IniFiles->new( -file => STDIN );
- a filehandle glob
open( CONFIG, "/path/to/config_file.ini" );
$cfg = Config::IniFiles->new( -file => *CONFIG );
- a reference to a glob
open( CONFIG, "/path/to/config_file.ini" );
$cfg = Config::IniFiles->new( -file => \*CONFIG );
- an
IO::Fileobject
$io = IO::File->new( "/path/to/config_file.ini" );
$cfg = Config::IniFiles->new( -file => $io );
or
open my $fh, '<', "/path/to/config_file.ini" or die $!;
$cfg = Config::IniFiles->new( -file => $fh );
- A reference to a scalar (requires newer versions of
IO::Scalar)
$ini_file_contents = <<EOT
[section name]
Parameter=A value
Setting=Another value
EOT
$cfg = Config::IniFiles->new( -file => \$ini_file_contents );
If this option is not specified, (i.e. you are creating a config file from scratch) you must specify a target file using SetFileName in order to save the parameters. no file, no save, that's the deal. π
-defaultsection β Specifies a section to be used for default values. For example, in the following configuration file, if you look up the"permissions"parameter in the"joe"section, there is none. π
[all]
permissions=Nothing
[jane]
name=Jane
permissions=Open files
[joe]
name=Joseph
If you create your Config::IniFiles object with a default section of "all" like this:
$cfg = Config::IniFiles->new( -file => "file.ini", -default => "all" );
Then requesting a value for a "permissions" in the [joe] section will check for a value from [all] before returning undef.
$permissions = $cfg->val( "joe", "permissions"); // returns "Nothing"
joe gets the default and doesn't even know it. king behavior. π
-fallbacksection β Specifies a section to be used for parameters outside a section. Default is none. Without-fallbackspecified (which is the default), reading a configuration file which has a parameter outside a section will fail. π With this set to, say,"GENERAL", this configuration:
wrong=wronger
[joe]
name=Joseph
will be assumed as:
[GENERAL]
wrong=wronger
[joe]
name=Joseph
Note that Config::IniFiles will also omit the fallback section header when outputting such configuration. sneaky but polite. β¨
-nocase0|1β Set-nocase => 1to handle the config file in a case-insensitive manner (case in values is preserved, however). By default, config files are case-sensitive (i.e., a section named'Test'is not the same as a section named'test'). Note that there is an added overhead for turning off case sensitivity. pay the toll, bestie. π£οΈ
-importobject β This allows you to import or inherit existing setting from anotherConfig::IniFilesobject. When importing settings from another object, sections with the same name will be merged and parameters that are defined in both the imported object and the-filewill take the value of given in the-file.
If a -default section is also given on this call, and it does not coincide with the default of the imported object, the new default section will be used instead. If no -default section is given, then the default of the imported object will be used.
-allowcontinue0|1β Set-allowcontinue => 1to enable continuation lines in the config file. i.e. if a line ends with a backslash"\", then the following line is appended to the parameter value, dropping the backslash and the newline character(s).
Default behavior is to keep a trailing backslash "\" as a parameter value. Note that continuation cannot be mixed with the "here" value syntax. pick a lane, girlie. π¦
-allowempty0|1β If set to1, then empty files are allowed atReadConfigtime. If set to0(the default), an empty configuration file is considered an error. π
-negativedeltas0|1β If set to1(the default if importing this object from another one), parses and honors lines of the following form in the configuration file:
; [somesection] is deleted
or
[inthissection]
; thisparameter is deleted
If set to 0 (the default if not importing), these comments are treated like ordinary ones.
The WriteConfig1)> form will output such comments to indicate deleted sections or parameters. This way, reloading a delta file using the same imported object produces the same results in memory again. See " DELTA FEATURES" in IMPORT for more details. π₯
-commentchar'char'β The default comment character is"#". You may change this by specifying this option to another character. This can be any character except alphanumeric characters, square brackets or the "equal" sign. π«
-allowedcommentchars'chars'β Allowed default comment characters are"#"and";". By specifying this option you may change the range of characters that are used to denote a comment line to include any set of characters.
Note: that the character specified by -commentchar (see above) is always part of the allowed comment characters.
Note 2: The given string is evaluated as a regular expression character class, so '\' must be escaped if you wish to use it. β οΈ
-reloadwarn0|1β Set-reloadwarn => 1to enable a warning message (output toSTDERR) whenever the config file is reloaded. The reload message is of the form:
PID <PID> reloading config file <file> at YYYY.MM.DD HH:MM:SS
Default behavior is to not warn (i.e. -reloadwarn => 0).
This is generally only useful when using Config::IniFiles in a server or daemon application. The application is still responsible for determining when the object is to be reloaded. that part's on you, bestie. π«‘
-nomultiline0|1β Set-nomultiline => 1to output multi-valued parameter as:
param=value1
param=value2
instead of the default:
param=<<EOT
value1
value2
EOT
As the latter might not be compatible with all applications. π
-handle_trailing_comment0|1β Set-handle_trailing_comment => 1to enable support of parameter trailing comments.
For example, if we have a parameter line like this:
param1=value1;comment1
so yeah β default vibe is handle_trailing_comment = 0, and you're getting value1;comment1 as the value of param1. But flip -handle_trailing_comment to 1 and suddenly it's value1 for param1 and comment1 as the trailing comment of param1. chef's kiss π
Set and get methods for trailing comments are provided as SetParameterTrailingComment and GetParameterTrailingComment.
-php_compat 0|1β set-php_compat => 1and you get support for PHP-like config files. β¨
The differences between parse_ini_file and Config::IniFiles are:
# parse_ini_file
[group]
val1="value"
val2[]=1
val2[]=2
vs
# Config::IniFiles
[group]
val1=value
val2=1
val2=2
Lowkey important: this option only affects parsing, not writing new config files. π«Ά
Some features from parse_ini_file are not compatible:
[group]
val1="val"'ue'
val1[key]=1
π METHODS π (the rest of the saga)
val ($section, $parameter [, $default] )
Returns the value of the specified parameter ($parameter) in section $section. Returns undef (or $default if you passed one) if there's no section or no parameter for the given section. π
Want a multi-line/value field handed back as an array? Just ask for an array as the receiver:
@values = $cfg->val('Section', 'Parameter');
A multi-line/value field returned in scalar context gets joined using $/ (the input record separator β default is \n) if it's defined, otherwise the values get joined using \n.
exists($section, $parameter)
True if and only if there's a section $section with a parameter $parameter inside it β and no, default values don't count. periodt.
push ($section, $parameter, $value, [ $value2, ...])
Pushes new values onto the end of the existing value(s) of parameter $parameter in section $section. Scroll down for the methods that write your new config back out to a file.
You may not set a parameter that didn't exist in the original configuration file. If you try,pushreturnsundef. Seenewvalbelow if that's what you're after. Otherwise it returns1. π
setval ($section, $parameter, $value, [ $value2, ... ])
Sets the value of parameter $parameter in section $section to $value (or to a whole set of values). See below for methods to write the new configuration back out to a file.
Same rules aspush, bestie β you may not set a parameter that didn't exist in the original config file, andsetvalreturnsundefif you attempt it. Usenewvalbelow for that. Otherwise, returns1. π
newval($section, $parameter, $value [, $value2, ...])
Assigns a new value, $value (or set of values), to parameter $parameter in section $section in the configuration file. π
delval($section, $parameter)
Deletes the specified parameter from the configuration file. bye bitch π
ReadConfig
Forces the configuration file to be re-read. Returns undef if the file can't be opened, no filename was defined (with the -file option) when the object was constructed, or an error happened while reading. π΅
If an error occurs while parsing the INI file, the @Config::IniFiles::errors array will hold messages that might help you figure out where in the file the problem is. π
Sections
Returns an array with the section names in the configuration file. If the nocase option was turned on when the config object was created, the section names come back in lowercase. β¨
SectionExists ( $sect_name )
Returns 1 if the specified section exists in the INI file, 0 otherwise (and undef if section_name isn't defined).
AddSection ( $sect_name )
Makes sure the named section exists in the INI file. If it already exists, nothing happens β and in that case, the "new" section will possibly contain data already. π
If you genuinely need a brand-new section with no parameters in it, double-check that the name you're adding isn't already in the list of sections.
DeleteSection ( $sect_name )
Completely removes the entire section from the configuration. gone. deleted. never happened. π
RenameSection ( $old_section_name, $new_section_name, $include_groupmembers)
Renames a section if it doesn't already exist, optionally including groupmembers.
CopySection ( $old_section_name, $new_section_name, $include_groupmembers)
Copies one section to another, optionally including groupmembers.
Parameters ($sect_name)
Returns an array containing the parameters inside the specified section.
Groups
Returns an array containing the names of available groups.
Groups are specified in the config file as new sections shaped like this:
[GroupName MemberName]
Super useful for building up lists. Note that parameters inside a "member" section are referenced normally (i.e., the section name is still "Groupname Membername", space and all) β the whole concept of Groups is just to help people building more complex configuration files. π§
SetGroupMember ( $sect )
Makes sure the specified section is a member of the appropriate group.
Only intended for use in newval. π
RemoveGroupMember ( $sect )
Makes sure the specified section is no longer a member of the appropriate group. Only intended for use in DeleteSection.
GroupMembers ($group)
Returns an array containing the members of the specified $group. Each element of the array is a section name. For example, given the sections
[Group Element 1]
...
[Group Element 2]
...
GroupMembers would return ("Group Element 1", "Group Element 2"). slay πΈ
SetWriteMode ($mode)
Sets the mode (permissions) to use when writing the INI file.
$mode must be a string representation of the octal mode.
GetWriteMode ($mode)
Gets the current mode (permissions) used when writing the INI file.
$mode is a string representation of the octal mode.
WriteConfig ($filename [, %options])
Writes out a new copy of the configuration file. A temporary file gets written out and then renamed to the specified filename. Also peep BUGS below. π
If -delta is set to a true value in %options, and this object was imported from another one (see new), only the differences between this object and the imported one get recorded. Negative deltas will be encoded into comments, so that a later invocation of new() with the same imported object produces the same results (see the -negativedeltas option in new).
%options is not required.
Returns true on success, undef on failure. π
RewriteConfig
Same as WriteConfig, but specifies that the original configuration file should be rewritten. π₯
GetFileName
Returns the filename associated with this INI file.
If no filename has been specified, returns undef.
SetFileName ($filename)
If you created the Config::IniFiles object without initialising from a file, or if you just want to change the name of the file used for ReadConfig/RewriteConfig from now on, use this method. π
Returns $filename if that was a valid name, undef otherwise.
$ini->OutputConfigToFileHandle($fh, $delta)
Writes OutputConfig to the $fh filehandle. $delta should be set to 1 1 if writing only delta. This is a newer and safer version of OutputConfig() and you're encouraged to use it instead. π«Ά
$ini->OutputConfig($delta)
Writes OutputConfig to STDOUT. Use select() to redirect STDOUT to the output target before calling this function. The optional argument should be set to 1 if writing only a delta. Also see OutputConfigToFileHandle. β¨
SetSectionComment($section, @comment)
Sets the comment for section $section to the lines contained in @comment.
Each comment line gets prepended with the comment character (default is #) if it doesn't already have one (ie: if the line does not start with whitespace followed by an allowed comment character β default is # and ;).
To clear a section comment, use DeleteSectionComment ($section). π§Ή
GetSectionComment ($section)
Returns a list of lines β the comment attached to section $section. In scalar context, returns a string with the lines of the comment separated by newlines.
The lines are presented as-is, with whatever comment character was originally used on that line. π
DeleteSectionComment ($section)
Removes the comment for the specified section.
SetParameterComment ($section, $parameter, @comment)
Sets the comment attached to a particular parameter.
Any line of @comment that doesn't have a comment character gets one prepended. See "SetSectionComment($section, @comment)" above. πΈ
GetParameterComment ($section, $parameter)
Gets the comment attached to a parameter. In list context returns all comments β in scalar context returns them joined by newlines.
DeleteParameterComment ($section, $parameter)
Deletes the comment attached to a parameter. poof β¨
GetParameterEOT ($section, $parameter)
Accessor method for the EOT text (in fact, style) of the specified parameter. If any text is used as an EOT mark, this is what gets returned. If the parameter wasn't recorded using HERE style multiple lines, GetParameterEOT returns undef.
$cfg->SetParameterEOT ($section, $parameter, $EOT)
Accessor method for the EOT text for the specified parameter. Sets the HERE style marker text to the value $EOT. Once the EOT text is set, that parameter will be saved in HERE style.
To un-set the EOT text, use DeleteParameterEOT ($section, $parameter). π
DeleteParameterEOT ($section, $parameter)
Removes the EOT marker for the given section and parameter. When writing a configuration file, if no EOT marker is defined then "EOT" is used.
SetParameterTrailingComment ($section, $parameter, $cmt)
Set the end trailing comment for the given section and parameter. If there's an old comment for the parameter, it gets overwritten by the new one. π
If there's a new parameter trailing comment to be added, the value should be added first.
GetParameterTrailingComment ($section, $parameter)
An accessor method to read the trailing comment after the parameter. The trailing comment gets returned if there is one. A null string is returned if the parameter exists but has no comment for it. Otherwise, undef gets returned. π
Delete
Deletes the entire configuration file in memory. π
β¨ USAGE -- Tied Hash β¨
okay bestie this is the part where things get β¨magicalβ¨ β instead of making an object and calling methods on it, you can just tie a hash to a Config::IniFiles object and use it like, a hash. π
tie %ini, 'Config::IniFiles', (-file=>$filename, [-option=>value ...] )β when youtiea hash to aConfig::IniFilesobject, you get a brand-new object you can reach through your hash, so you use this instead of thenewmethod. It literally builds a hash of hashes so you can grab the values in the INI file. The options you pass throughtieare the exact same ones you'd givenew, up above. π
Here's the example, no cap:
use Config::IniFiles;
my %ini;
tie %ini, 'Config::IniFiles', ( -file => "/path/configfile.ini" );
print "We have $ini{Section}{Parameter}." if $ini{Section}{Parameter};
Accessing and using the hash works just like accessing a regular hash, and a whole bunch of the object methods are made available through the hash interface too. π
For those methods that don't vibe with the hash paradigm, you can use the Perl tied function to get at the underlying object tied to the hash and call methods on that object. For example, to write the hash out to a new ini file, you'd do something like this:
tied( %ini )->WriteConfig( "/newpath/newconfig.ini" ) ||
die "Could not write settings to new file.";
$val = $ini{$section}{$parameter}β returns the value of$parameterin$section. πΈ
Multiline values accessed through a hash will be returned as a list in list context and a concatenated value in scalar context. (context matters, bestie, always has)
$ini{$section}{$parameter} = $value;β sets the value of$parameterin$sectionto$value.
To set a multiline or multi-value parameter just assign an array reference to the hash entry, like this:
$ini{$section}{$parameter} = [$value1, $value2, ...];
If the parameter did not exist in the original file, it will be created. BUT. Perl does not seem to extend autovivification to tied hashes. π That means that if you try to say
$ini{new_section}{new_paramters} = $val;
and the section 'new_section' does not exist, then Perl won't properly create it. To work around this you need to create a hash reference in that section and then assign the parameter value. Something like this should do nicely:
$ini{new_section} = {};
$ini{new_section}{new_paramters} = $val;
%hash = %{$ini{$section}}β using the tie interface, you can copy whole sections of the ini file into another hash. Note that this makes a copy of the entire section. The new hash is no longer tied to the ini file. In particular, this means-defaultand-nocasesettings will not apply to%hash. π¦$ini{$section} = {}; %{$ini{$section}} = %parameters;β through the hash interface, you have the ability to replace the entire section with a new set of parameters. This call will fail, however, if the argument passed in is NOT a hash reference. You must use both lines, as shown above, so that Perl recognizes the section as a hash reference context before COPYing over the values from your%parametershash. πdelete $ini{$section}{$parameter}β when tied to a hash, you can use the Perldeletefunction to completely remove a parameter from a section. πdelete $ini{$section}β the tied interface also allows you to delete an entire section from the ini file using the Perldeletefunction.%ini = ();β if you really want to delete all the items in the ini file, this will do it. Of course, the changes won't be written to the actual file unless you callRewriteConfigon the object tied to the hash. iykyk β¨
Parameter names π
my @keys = keys %{$ini{$section}}
while (($k, $v) = each %{$ini{$section}}) {...}
if( exists %{$ini{$section}}, $parameter ) {...}
When tied to a hash, you use the Perl keys and each functions to iteratively list the parameters (keys) or parameters and their values (each) in a given section. π
You can also use the Perl exists function to see if a parameter is defined in a given section.
Note: none of these will return parameter names that are part of the default section (if set), even though accessing an unknown parameter in the specified section will return a value from the default section if there is one. (sneaky but true)
Section names π¦
foreach( keys %ini ) {...}
while (($k, $v) = each %ini) {...}
if( exists %ini, $section ) {...}
When tied to a hash, you use the Perl keys and each functions to iteratively list the sections in the ini file. π
You can also use the Perl exists function to see if a section is defined in the file. β
π IMPORT / DELTA FEATURES π
The -import option to new lets you stack one Config::IniFiles object on top of another (which might itself be stacked in turn and so on recursively, but that's beyond the point, bestie). The effect, as briefly explained in new, is that the fields appearing in the composite object will be a superposition of those coming from the ``original'' one and the lines coming from the file β the latter taking precedence. π
For example, let's say that $master and "overlay" were created like this:
my $master = Config::IniFiles->new(-file => "master.ini");
my $overlay = Config::IniFiles->new(-file => "overlay.ini",
-import => $master);
If the contents of "master.ini" and "overlay.ini" are respectively
; master.ini
[section1]
arg0=unchanged from master.ini
arg1=val1
[section2]
arg2=val2
and
; overlay.ini
[section1]
arg1=overridden
Then "$overlay->val("section1", "arg1")" is "overridden", while "$overlay->val("section1", "arg0")" is "unchanged from master.ini". the overlay ate and left no crumbs π
This feature may be used to ship a ``global defaults'' configuration file for a Perl application, that can be overridden piecewise by a much shorter, per-site configuration file. Assuming UNIX-style path names, this would be done like this:
my $defaultconfig = Config::IniFiles->new
(-file => "/usr/share/myapp/myapp.ini.default");
my $config = Config::IniFiles->new
(-file => "/etc/myapp.ini", -import => $defaultconfig);
# Now use $config and forget about $defaultconfig in the rest of
# the program
Starting with version 2.39, Config::IniFiles also provides features to keep the importing / per-site configuration file small, by only saving those options that were modified by the running program. That is, if one calls
$overlay->setval("section1", "arg1", "anotherval");
$overlay->newval("section3", "arg3", "val3");
$overlay->WriteConfig('overlay.ini', -delta=>1);
"overlay.ini" would now contain
; overlay.ini
[section1]
arg1=anotherval
[section3]
arg3=val3
This is called a delta file (see "WriteConfig"). The untouched [section2] and arg0 do not appear, and the config file is therefore shorter; while of course, reloading the configuration into $master and $overlay, either through "$overlay->ReadConfig()" or through the same code as above (e.g. when application restarts), would yield exactly the same result had the overlay object been saved in whole to the file system. π
The only problem with this delta technique is one cannot delete the default values in the overlay configuration file, only change them. This is solved by a file format extension, enabled by the -negativedeltas option to "new": if, say, one would delete parameters like this,
$overlay->DeleteSection("section2");
$overlay->delval("section1", "arg0");
$overlay->WriteConfig('overlay.ini', -delta=>1);
The overlay.ini file would now read:
; overlay.ini
[section1]
; arg0 is deleted
arg1=anotherval
; [section2] is deleted
[section3]
arg3=val3
Assuming $overlay was later re-read with "-negativedeltas => 1", the parser would interpret the deletion comments to yield the correct result β that is, [section2] and arg0 would cease to exist in the $overlay object. πβ¨
π©Ί DIAGNOSTICS π©Ί
@Config::IniFiles::errorsβ contains a list of errors encountered while parsing the configuration file. If thenewmethod returnsundef, check the value of this to find out what's wrong. This value is reset each time a config file is read. π
π BUGS π
- The output from
[Re]WriteConfig/OutputConfigmight not be as pretty as it can be. Comments are tied to whatever was immediately below them. And case is not preserved for Section and Parameter names if the-nocaseoption was used. π - No locking is done by
[Re]WriteConfig. When writing servers, take care that only the parent ever calls this, and consider making your own backup. (fr fr, back it up)
Data Structure π§
Note: this is only a reference for the package maintainers β one of the upcoming revisions to this package will include a total clean up of the data structure.
$iniconf->{cf} = "config_file_name"
->{startup_settings} = \%orginal_object_parameters
->{imported} = $object WHERE $object->isa("Config::IniFiles")
->{nocase} = 0
->{reloadwarn} = 0
->{sects} = \@sections
->{mysects} = \@sections
->{sCMT}{$sect} = \@comment_lines
->{group}{$group} = \@group_members
->{parms}{$sect} = \@section_parms
->{myparms}{$sect} = \@section_parms
->{EOT}{$sect}{$parm} = "end of text string"
->{pCMT}{$sect}{$parm} = \@comment_lines
->{v}{$sect}{$parm} = $value OR \@values
->{e}{$sect} = 1 OR does not exist
->{mye}{$sect} = 1 OR does not exists
π AUTHOR and ACKNOWLEDGEMENTS π
The original code was written by Scott Hutton. Then handled for a time by Rich Bowen (thanks!), and was later managed by Jeremy Wadsack (thanks!), and now is managed by Shlomi Fish ( http://www.shlomifish.org/ ) with many contributions from various other people. π«Ά
In particular, special thanks go to (in roughly chronological order):
Bernie Cosell, Alan Young, Alex Satrapa, Mike Blazer, Wilbert van de Pieterman, Steve Campbell, Robert Konigsberg, Scott Dellinger, R. Bernstein, Daniel Winkelmann, Pires Claudio, Adrian Phillips, Marek Rouchal, Luc St Louis, Adam Fischler, Kay RΓΆpke, Matt Wilson, Raviraj Murdeshwar and Slaven Rezic, Florian Pfaff
Geez, that's a lot of people. And apologies to the folks who were missed. π
If you want someone to bug about this, that would be:
Shlomi Fish <shlomif@cpan.org>
If you want more information, or want to participate, go to:
http://sourceforge.net/projects/config-inifiles/
Please submit bug reports using the Request Tracker interface at https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IniFiles . π
Development discussion occurs on the mailing list config-inifiles-dev@lists.sourceforge.net, which you can subscribe to by going to the project web site (link above). πΈ
π LICENSE
okay so bestie, legal bit incoming, but it's the cute kind i promise π«Ά
This software is copyright (c) 2000 by Scott Hutton and the rest of the Config::IniFiles contributors.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. slay, you can literally do whatever β¨
π AUTHOR
Shlomi Fish <shlomif@cpan.org>
like. the main character. the one who maintains this whole thing. respect π
πΈ COPYRIGHT AND LICENSE
This software is copyright (c) 2000 by RBOW and others.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. same energy as above, different name on the deed π
π BUGS
Please report any bugs or feature requests on the bugtracker website <https://github.com/shlomif/perl-Config-IniFiles/issues>
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. fr fr, a test file is the love language here β no test file and we're all just guessing at your vibe π¦
π«Ά SUPPORT
π Perldoc
You can find documentation for this module with the perldoc command. yes. the classic. the iconique.
perldoc Config::IniFiles
π Websites
The following websites have more information about this module, and may be of help to you. As always, in addition to those websites please use your favorite search engine to discover more resources. iykyk
- MetaCPAN β A modern, open-source CPAN search engine, useful to view POD in HTML format.
<https://metacpan.org/release/Config-IniFiles>
- RT: CPAN's Bug Tracker β The RT ( Request Tracker ) website is the default bug/issue tracking system for CPAN.
<https://rt.cpan.org/Public/Dist/Display.html?Name=Config-IniFiles>
- CPANTS β The CPANTS is a website that analyzes the Kwalitee ( code metrics ) of a distribution.
<http://cpants.cpanauthors.org/dist/Config-IniFiles>
- CPAN Testers β The CPAN Testers is a network of smoke testers who run automated tests on uploaded CPAN distributions.
<http://www.cpantesters.org/distro/C/Config-IniFiles>
- CPAN Testers Matrix β The CPAN Testers Matrix is a website that provides a visual overview of the test results for a distribution on various Perls/platforms.
<http://matrix.cpantesters.org/?dist=Config-IniFiles>
- CPAN Testers Dependencies β The CPAN Testers Dependencies is a website that shows a chart of the test results of all dependencies for a distribution.
<http://deps.cpantesters.org/?module=Config::IniFiles>
π Bugs / Feature Requests
Please report any bugs or feature requests by email to "bug-config-inifiles at rt.cpan.org", or through the web interface at <https://rt.cpan.org/Public/Bug/Report.html?Queue=Config-IniFiles>. You will be automatically notified of any progress on the request by the system. automatic updates?? we love a system that keeps you posted ππ
π§ Source Code
The code is open to the world, and available for you to hack on. Please feel free to browse it and play with it, or whatever. If you want to contribute patches, please send me a diff or prod me to pull from your repository :) prodding is a valid contribution method, noted π
<https://github.com/shlomif/perl-Config-IniFiles>
git clone git://github.com/shlomif/perl-Config-IniFiles.git
and that's the whole page bestie π this was perl v5.42.2, dated 2026-06-11, and it's Config::IniFiles(3pm) β go forth and configure your little heart out, you absolute icon πβ¨π
π¦ where this page comes from
- fedora 43: perl-Config-IniFiles 3.001000-1.fc43 Β· GPL-1.0-or-later OR Artistic-1.0-Perl
- fedora 44: perl-Config-IniFiles 3.001000-1.fc44 Β· GPL-1.0-or-later OR Artistic-1.0-Perl
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms