AppConfig(3)
okay bestie, welcome to the AppConfig(3) manual page (User Contributed Perl Documentation, if we're being fancy โจ) โ grab a lil snack, this one's a long read but it's so worth it ๐
๐ธ NAME ๐ธ
AppConfig โ a Perl5 module for reading configuration files and parsing command line arguments. That's it, that's the whole vibe ๐
โจ SYNOPSIS โจ
use AppConfig;
# create a new AppConfig object
my $config = AppConfig->new( \%cfg );
# define a new variable
$config->define( $varname => \%varopts );
# create/define combined
my $config = AppConfig->new( \%cfg,
$varname => \%varopts,
$varname => \%varopts,
...
);
# set/get the value
$config->set( $varname, $value );
$config->get($varname);
# shortcut form
$config->varname($value);
$config->varname;
# read configuration file
$config->file($file);
# parse command line options
$config->args(\@args); # default to \@ARGV
# advanced command line options with Getopt::Long
$config->getopt(\@args); # default to \@ARGV
# parse CGI parameters (GET method)
$config->cgi($query); # default to $ENV{ QUERY_STRING }
๐ฆ OVERVIEW ๐ฆ
So like, AppConfig is a Perl5 module for managing application configuration information. It keeps track of the state of literally any number of variables, and it hands you methods for parsing configuration files, command line arguments, and CGI script parameters. Main character energy tbh ๐
Variables' values can be set from configuration files. A variable can be a flag (On/Off), it can take a single value, or it can take multiple values stored as a list or a hash. How many arguments a variable expects? That's decided by its config when you define it. Slay.
# flags
verbose
nohelp
debug = On
# single value
home = /home/abw/
# multiple list value
file = /tmp/file1
file = /tmp/file2
# multiple hash value
book camel = Programming Perl
book llama = Learning Perl
The - prefix resets a variable to its default value, and the + prefix sets it to 1. cute lil shortcuts, no cap:
-verbose
+debug
Variable expansion, environment variable expansion, and tilde (home directory) expansion can all be applied โ selectively, if you need to be picky about it โ to the values read from configuration files:
home = ~ # home directory
nntp = ${NNTPSERVER} # environment variable
html = $home/html # internal variables
img = $html/images
Configuration files can also be arranged in blocks, Win32 "INI" file style ๐
[file]
site = kfs
src = ~/websrc/docs/$site
lib = ~/websrc/lib
dest = ~/public_html/$site
[page]
header = $lib/header
footer = $lib/footer
You can also use Perl's "heredoc" syntax to define a big block of text inside a configuration file. iconic behavior:
multiline = <<FOOBAR
line 1
line 2
FOOBAR
paths exe = "${PATH}:${HOME}/.bin"
paths link = <<'FOO'
${LD_LIBARRAY_PATH}:${HOME}/lib
FOO
Variables can get set by parsing command line arguments too:
myapp -verbose -site kfs -file f1 -file f2
AppConfig gives you a simple method (args()) for parsing command line arguments. And there's a second method (getopt()) that handles way more complex argument processing by delegating to Johan Vroman's Getopt::Long module. fancy ๐
AppConfig also lets variables be set by parameters passed to a CGI script via the URL (GET method):
http://www.nowhere.com/cgi-bin/myapp?verbose&site=kfs
๐ง PREREQUISITES ๐ง
AppConfig requires Perl 5.005 or later. fr fr.
The Getopt::Long and Test::More modules should be installed. If you're on a recent version of Perl (e.g. 5.8.0) then these should already be installed, bestie, you're probably fine ๐
๐ OBTAINING AND INSTALLING THE AppConfig MODULE BUNDLE ๐
The AppConfig module bundle is available from CPAN. As the 'perlmod' manual page explains:
CPAN stands for the Comprehensive Perl Archive Network.
This is a globally replicated collection of all known Perl
materials, including hundreds of unbundled modules.
[...]
For an up-to-date listing of CPAN sites, see
http://www.perl.com/perl/ or ftp://ftp.perl.com/perl/ .
Within the CPAN archive, AppConfig is in the category:
12) Option, Argument, Parameter and Configuration File Processing
The module is available in the following directories:
/modules/by-module/AppConfig/AppConfig-<version>.tar.gz
/authors/id/ABW/AppConfig-<version>.tar.gz
AppConfig is distributed as a single gzipped tar archive file:
AppConfig-<version>.tar.gz
Note that <version> represents the current AppConfig version number, of the form n.nn, e.g. 3.14. Peep the REVISION section below to figure out the current version number for AppConfig ๐
Unpack the archive to create a AppConfig installation directory:
gunzip AppConfig-<version>.tar.gz
tar xvf AppConfig-<version>.tar
cd into that directory, make, test and install the modules:
cd AppConfig-<version>
perl Makefile.PL
make
make test
make install
The 't' sub-directory contains a bunch of test scripts that get run when a 'make test' is run.
The 'make install' will install the module on your system. You might need administrator privileges for that one, sorry ๐ญ If you install the module in a local directory (for example, by executing perl Makefile.PL LIB=~/lib in the above โ see "perldoc MakeMaker" for full details), you'll need to make sure the PERL5LIB environment variable is set to include the location, or add a line to your scripts explicitly naming the library location:
use lib '/local/path/to/lib';
The 'examples' sub-directory contains some simple examples of using the AppConfig modules ๐ซถ
๐ DESCRIPTION ๐
USING THE AppConfig MODULE
To import and use the AppConfig module, this line should appear in your Perl script:
use AppConfig;
To import constants defined by the AppConfig module, pass the name of one or more of the constant or tag sets as parameters to use:
use AppConfig qw(:expand :argcount);
See "CONSTANT DEFINITIONS" below for more info on the constant tagsets AppConfig defines โจ
AppConfig is implemented using object-oriented methods. A new AppConfig object gets created and initialized using the new() method. This returns a reference to a new AppConfig object.
my $config = AppConfig->new();
This will create and return a reference to a new AppConfig object. slay.
In doing so, the AppConfig object also creates an internal reference to an AppConfig::State object, and that's where variable state lives. All arguments passed into the AppConfig constructor get passed directly to the AppConfig::State constructor.
The first (optional) parameter may be a reference to a hash array containing configuration information.
my $config = AppConfig->new( {
CASE => 1,
ERROR => \&my_error,
GLOBAL => {
DEFAULT => "<unset>",
ARGCOUNT => ARGCOUNT_ONE,
},
} );
See AppConfig::State for full details of the configuration options available. In brief, they are:
CASEโ sets case sensitivity for variable names (default: off).CREATEโ says undefined variables should be created automatically (default: off).GLOBALโ a reference to a hash array of global values used by default when defining variables. Valid global values areDEFAULT,ARGCOUNT,EXPAND,VALIDATEandACTION.PEDANTICโ says the command line and configuration file parsing routines should return immediately on encountering an error.ERRORโ lets you provide a error handling routine. Arguments as perprintf().
Subsequent parameters may be variable definitions. These get passed to the define() method, described below in "DEFINING VARIABLES" ๐
my $config = AppConfig->new("foo", "bar", "baz");
my $config = AppConfig->new( { CASE => 1 }, qw(foo bar baz) );
Note that any unresolved method calls to AppConfig are automatically delegated to the AppConfig::State object. In practice, that means you can treat the AppConfig object as if it were an AppConfig::State object:
# create AppConfig
my $config = AppConfig->new('foo', 'bar');
# methods get passed through to internal AppConfig::State
$config->foo(100);
$config->set('bar', 200);
$config->define('baz');
$config->baz(300);
DEFINING VARIABLES
The define() method (delegated to AppConfig::State) is what you use to pre-declare a variable and specify its configuration.
$config->define("foo");
Variables can also be defined straight from the AppConfig new() constructor:
my $config = AppConfig->new("foo");
In both simple examples above, a new variable called "foo" is defined. You can also pass a reference to a hash array to specify configuration information for the variable:
$config->define("foo", {
DEFAULT => 99,
ALIAS => 'metavar1',
});
Configuration items specified in the GLOBAL option to the module constructor get applied by default when variables are created. e.g.
my $config = AppConfig->new( {
GLOBAL => {
DEFAULT => "<undef>",
ARGCOUNT => ARGCOUNT_ONE,
}
} );
$config->define("foo");
$config->define("bar", { ARGCOUNT => ARGCOUNT_NONE } );
is equivalent to:
my $config = AppConfig->new();
$config->define( "foo", {
DEFAULT => "<undef>",
ARGCOUNT => ARGCOUNT_ONE,
} );
$config->define( "bar",
DEFAULT => "<undef>",
ARGCOUNT => ARGCOUNT_NONE,
);
Multiple variables can be defined in the same call to define(). Configuration hashes for variables can be omitted. yes bestie, it's flexible like that ๐
$config->define("foo", "bar" => { ALIAS = "boozer" }, "baz");
See AppConfig::State for full details of the configuration options available when defining variables. In brief, they are:
DEFAULTโ the default value for the variable (default: undef).ALIASโ one or more (list reference or"list|like|this") alternative names for the variable.ARGCOUNTโ specifies the number and type of arguments that the variable expects. Constants in the:expandtag set defineARGCOUNT_NONEโ a simple on/off flag (default),ARGCOUNT_ONEโ single value,ARGCOUNT_LISTโ multiple values accessed via list reference,ARGCOUNT_HASHโ hash table,"key=value", accessed via hash reference.
๐ ARGS
Lowkey the multitasker โ this hands an argument spec string straight to Getopt::Long via AppConfig::Getopt. Like, for example, "=i", ":s", "=s@". ๐
And plot twist: you can use it to implicitly set the ARGCOUNT value too:
"/^!/"โARGCOUNT_NONE"/@/"โARGCOUNT_LIST"/%/"โARGCOUNT_HASH"/[=:].*/"โARGCOUNT_ONE
โจ EXPAND
Tells AppConfig which variable expansion policies to use when it's parsing configuration files. The constants live in the :expand tag set and they are:
EXPAND_NONEโ no expansion (this is the default, bestie)EXPAND_VARโ expand$varor$(var)as other variablesEXPAND_UIDโ expand~and~uidas the user's home directoryEXPAND_ENVโ expand${var}as an environment variableEXPAND_ALLโ do all the expansions, go off ๐
๐ VALIDATE
A regex that the intended variable value should match, or a code reference that returns 1 to say "yep, validation passed" (at which point the variable may now be set).
๐ธ ACTION
A code reference that gets called whenever the variable value changes. Little notification hook, iykyk.
๐ฆ COMPACT FORMAT DEFINITION
Okay so you can also define variables with a compact format โ it's literally identical to the specification format of Getopt::Long, and it goes like this:
"name|alias|alias<argopts>"
The first element is the variable name, and then you can pile on extra ALIAS values, each one separated by a vertical bar '|'.
The <argopts> element is where the ARGCOUNT value goes, and it can be any of these:
! ARGCOUNT_NONE
=s ARGCOUNT_ONE
=s@ ARGCOUNT_LIST
=s% ARGCOUNT_HASH
Getopt::Long supports extra constructs, and you can absolutely use those instead of the "=s" element (like "=f", for instance). The whole entire <argopts> element gets stored in the ARGS parameter for the variable and passed through intact to Getopt::Long when the getopt() method is called. ๐ซถ
Here's the compact format in action, paired with its equivalent full specification:
$config->define("foo|bar|baz!");
$config->define(
"foo" => {
ALIAS => "bar|baz",
ARGCOUNT => ARGCOUNT_NONE,
});
$config->define("name=s");
$config->define(
"name" => {
ARGCOUNT => ARGCOUNT_ONE,
});
$config->define("file|filelist|f=s@");
$config->define(
"file" => {
ALIAS => "filelist|f",
ARGCOUNT => ARGCOUNT_LIST,
});
$config->define("user|u=s%");
$config->define(
"user" => {
ALIAS => "u",
ARGCOUNT => ARGCOUNT_HASH,
});
You can still add extra config options by hash reference, same as usual. But heads up: the compact definition format will override any configuration values you provided for ARGS and ARGCOUNT.
$config->define("file|filelist|f=s@", { VALIDATE => \&check_file } );
๐ READING AND MODIFYING VARIABLE VALUES
AppConfig defines two methods (via AppConfig::State) for messing with variable values:
set($variable, $value);
get($variable);
Once a variable is defined, you can access it directly as an object method โ the method name is just the same as the variable name. So:
$config->set("verbose", 1);
is equivalent to
$config->verbose(1);
Okay but here's the thing you need to know ๐ โ AppConfig defines these methods:
new();
file();
args();
getopt();
And also, by delegating to AppConfig::State:
define()
get()
set()
varlist()
So if you define a variable with one of those names, you will not be able to access it directly as an object method. Like:
$config->file();
That's gonna call the file() method instead of returning the value of the 'file' variable. Not me finding that out the hard way ๐ญ. The workaround is to explicitly call get() and set() on a variable whose name conflicts:
$config->get('file');
or to define a "safe" alias that the variable can be accessed through:
$config->define("file", { ALIAS => "fileopt" });
or
$config->define("file|fileopt");
...
$config->fileopt();
Without parameters, the current value of the variable is returned. If you do pass a parameter, the variable gets set to that value and the result of the set() operation comes back to you.
$config->age(29); # sets 'age' to 29, returns 1 (ok)
print $config->age(); # prints "29"
The varlist() method extracts a bunch of variables into a hash array. First parameter should be a regular expression that gets matched against the variable names.
my %vars = $config->varlist("^file"); # all "file*" variables
You can pass a second parameter (any true value) to say "hey, strip the part of the variable name that matched the regex when you copy it into the target hash":
$config->file_name("/tmp/file");
$config->file_path("/foo:/bar:/baz");
my %vars = $config->varlist("^file_", 1);
# %vars:
# name => /tmp/file
# path => "/foo:/bar:/baz"
๐ง READING CONFIGURATION FILES
AppConfig gives you a streamlined interface for reading configuration files, courtesy of the AppConfig::File module. The file() method auto-loads AppConfig::File and creates an object to process the config file (or files). Variables chillin' in the internal AppConfig::State get automatically updated with whatever values are specified in the configuration file. โจ
$config->file($filename);
You can pass multiple files to file() โ either the file name, or a reference to an open file handle or glob.
$config->file($filename, $filehandle, \*STDIN, ...);
The file can contain blank lines and comments (prefixed by '#') and those just get ignored. Continuation lines are marked by ending the line with a '\'.
# this is a comment
callsign = alpha bravo camel delta echo foxtrot golf hipowls \
india juliet kilo llama mike november oscar papa \
quebec romeo sierra tango umbrella victor whiskey \
x-ray yankee zebra
Variables that are simple flags and don't expect an argument (ARGCOUNT = ARGCOUNT_NONE) can be specified with no value at all. They get set to 1, and any value explicitly specified (except "0" and "off") is just ignored. You can also slap a "no" prefix on the variable to implicitly set it to 0. ๐
verbose # on (1)
verbose = 1 # on (1)
verbose = 0 # off (0)
verbose off # off (0)
verbose on # on (1)
verbose mumble # on (1)
noverbose # off (0)
Variables that do expect an argument (ARGCOUNT = ARGCOUNT_ONE) get set to whatever follows the variable name, all the way to the end of the current line (continuation lines included, bestie). You can stick an optional equals sign between the variable and the value for clarity โ it's giving organized.
room = /home/kitchen
room /home/bedroom
And every subsequent re-definition of the variable value just overwrites the previous one. Periodt.
print $config->room(); # prints "/home/bedroom"
Variables can be defined to accept multiple values (ARGCOUNT = ARGCOUNT_LIST). Each subsequent definition of the variable adds the value to the list of values already set for it. ๐
drink = coffee
drink = tea
A reference to a list of values comes back when you request the variable:
my $beverages = $config->drink();
print join(", ", @$beverages); # prints "coffee, tea"
Variables can also be defined as hash lists (ARGCOUNT = ARGCOUNT_HASH). Each subsequent definition creates a new key and value in the hash array.
alias l="ls -CF"
alias e="emacs"
A reference to the hash comes back when you request the variable:
my $aliases = $config->alias();
foreach my $k (keys %$aliases) {
print "$k => $aliases->{ $k }\n";
}
The '-' prefix resets a variable to its default value, and the '+' prefix sets it to 1. Cute, right? ๐
-verbose
+debug
๐ VARIABLE EXPANSION
Variable values can contain references to other AppConfig variables, environment variables, and/or users' home directories. Whether those get expanded depends on the EXPAND value for each variable, or on the GLOBAL EXPAND value.
There are three different expansion types you can apply:
bin = ~/bin # expand '~' to home dir if EXPAND_UID
tmp = ~abw/tmp # as above, but home dir for user 'abw'
perl = $bin/perl # expand value of 'bin' variable if EXPAND_VAR
ripl = $(bin)/ripl # as above with explicit parens
home = ${HOME} # expand HOME environment var if EXPAND_ENV
See AppConfig::State for more info on expanding variable values. ๐
Configuration files can have variables arranged in blocks, too. A block header โ that's the block name sitting in square brackets โ introduces a configuration block. The block name plus an underscore then gets prefixed onto the names of all variables referenced in that block afterwards. The block keeps going until the next block definition or until the end of the current file.
[block1]
foo = 10 # block1_foo = 10
[block2]
foo = 20 # block2_foo = 20
โญ PARSING COMMAND LINE OPTIONS
Two whole methods for processing command line options, bestie, pick your fighter:
The first, args(), is a small and efficient little implementation that offers basic functionality. The second, getopt(), offers a way more powerful and complete facility by delegating the task to Johan Vroman's Getopt::Long module. The trade-off between args() and getopt() is essentially speed/size against flexibility โ so use whichever fits. Both of them implement on-demand loading of modules and incur zero overhead until they're actually used. Slay. ๐ฅ
The args() method parses simple command line options. It automatically loads the AppConfig::Args module and creates an object to process the command line arguments. Variables stored in the internal AppConfig::State get automatically updated with the values specified in the arguments.
You should pass it a reference to a list of arguments to parse. If you call args() with no parameters, the @ARGV array gets used.
$config->args(\@myargs);
$config->args(); # uses @ARGV
Arguments get read and shifted off the array until the first one is encountered that is not prefixed by '-' or '--'. At that point the method returns 1 to indicate success, leaving any unprocessed arguments remaining in the list. ๐ฆ
Okay bestie, so each argument should be the name or alias of a variable prefixed by - or -- โจ. If an argument isnโt prefixed like that โ and itโs not an additional parameter to the previous argument โ itโll cause a warning to be raised ๐ญ. If the PEDANTIC option is set, the method returns 0 immediately. With PEDANTIC unset (the default), the method keeps parsing the rest of the arguments, returning 0 when itโs done ๐
.
If the variable is a simple flag (ARGCOUNT = ARGCOUNT_NONE), then itโs set to 1. The variable may be prefixed by "no" to set its value to 0.
myprog -verbose --debug -notaste # $config->verbose(1)
# $config->debug(1)
# $config->taste(0)
Variables that expect an additional argument (ARGCOUNT != 0) get set to the value of the argument following it.
myprog -f /tmp/myfile # $config->file('/tmp/file');
Variables that expect multiple values (ARGCOUNT = ARGCOUNT_LIST or ARGCOUNT_HASH) have successive values added each time the option is encountered.
myprog -file /tmp/foo -file /tmp/bar # $config->file('/tmp/foo')
# $config->file('/tmp/bar')
# file => [ '/tmp/foo', '/tmp/bar' ]
myprog -door "jim=Jim Morrison" -door "ray=Ray Manzarek"
# $config->door("jim=Jim Morrison");
# $config->door("ray=Ray Manzarek");
# door => { 'jim' => 'Jim Morrison', 'ray' => 'Ray Manzarek' }
See AppConfig::Args for further details on parsing command line arguments ๐ธ.
The getopt() method is the glow-up that lets you use the power and flexibility of the Getopt::Long module to parse command line arguments, and have the internal values of the AppConfig object update automatically ๐.
The first parameters (as long as theyโre not list references) can be configuration strings to pass to Getopt::Long::Configure. A reference to a list of arguments may additionally be passed, or @ARGV is used by default.
$config->getopt(); # uses @ARGV
$config->getopt(\@myargs);
$config->getopt(qw(auto_abbrev debug)); # uses @ARGV
$config->getopt(qw(debug), \@myargs);
See Getopt::Long for details of the configuration options available โจ.
The getopt() method constructs a specification string for each internal variable and then initializes Getopt::Long with those values. The specification string is constructed from the name, any aliases (delimited by a vertical bar |), and the value of the ARGS parameter.
$config->define("foo", {
ARGS => "=i",
ALIAS => "bar|baz",
});
# Getopt::Long specification: "foo|bar|baz=i"
Errors and warnings generated by the Getopt::Long module are trapped and handled by the AppConfig error handler. That may be a user-defined routine installed with the ERROR configuration option ๐.
โ ๏ธ Please note that theAppConfig::Getoptinterface is still experimental and may not be100%operational. This is almost undoubtedly due to problems inAppConfig::Getoptrather thanGetopt::Long.
๐ธ๏ธ PARSING CGI PARAMETERS ๐ธ๏ธ
The cgi() method provides an interface to the AppConfig::CGI module for updating variable values based on the parameters appended to the URL for a CGI script ๐ฆ. This is commonly known as the CGI GET method. The CGI POST method is currently not supported ๐.
Parameter definitions are separated from the CGI script name by a question mark and from each other by ampersands. Where variables have specific values, these are appended to the variable with an equals sign:
http://www.here.com/cgi-bin/myscript?foo=bar&baz=qux&verbose
# $config->foo('bar');
# $config->baz('qux');
# $config->verbose(1);
Certain values specified in a URL must be escaped in the appropriate manner (see CGI specifications at http://www.w3c.org/ for full details). The AppConfig::CGI module automatically unescapes the CGI query string to restore the parameters to their intended values ๐.
http://where.com/mycgi?title=%22The+Wrong+Trousers%22
# $config->title('"The Wrong Trousers"');
โ ๏ธ Please be considerate of the security implications of providing writable access to script variables via CGI.
http://rebel.alliance.com/cgi-bin/...
.../send_report?file=%2Fetc%2Fpasswd&email=darth%40empire.com
To avoid any accidental or malicious changing of "private" variables, define only the "public" variables before calling the cgi() (or any other) method. Further variables can subsequently be defined which can not be influenced by the CGI parameters ๐ฅ.
$config->define('verbose', 'debug')
$config->cgi(); # can only set verbose and debug
$config->define('email', 'file');
$config->file($cfgfile); # can set verbose, debug, email + file
๐งฎ CONSTANT DEFINITIONS ๐งฎ
A number of constants are defined by the AppConfig module. These may be accessed directly (e.g. AppConfig::EXPAND_VARS) or by first importing them into the callerโs package. Constants are imported by specifying their names as arguments to use AppConfig, or by importing a set of constants identified by its "tag set" name ๐.
use AppConfig qw(ARGCOUNT_NONE ARGCOUNT_ONE);
use AppConfig qw(:argcount);
The following tag sets are defined:
๐ฑ :expand
The :expand tagset defines the following constants:
EXPAND_NONE
EXPAND_VAR
EXPAND_UID
EXPAND_ENV
EXPAND_ALL # EXPAND_VAR | EXPAND_UID | EXPAND_ENV
EXPAND_WARN
See AppConfig::File for full details of the use of these constants.
๐งธ :argcount
The :argcount tagset defines the following constants:
ARGCOUNT_NONE
ARGCOUNT_ONE
ARGCOUNT_LIST
ARGCOUNT_HASH
See AppConfig::State for full details of the use of these constants.
๐ฆ REPOSITORY ๐ฆ
The repo lives here: <https://github.com/neilbowers/AppConfig> ๐ซถ.
โ๏ธ AUTHOR โ๏ธ
Andy Wardley, <abw@wardley.org> ๐.
With contributions from Dave Viner, Ijon Tichy, Axel Gerstmair and many others whose names have been lost to the sands of time (reminders welcome) ๐.
๐ชช COPYRIGHT ๐ชช
Copyright (C) 1997-2007 Andy Wardley. All Rights Reserved.
Copyright (C) 1997,1998 Canon Research Centre Europe Ltd.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
๐ SEE ALSO ๐
AppConfig::StateAppConfig::FileAppConfig::ArgsAppConfig::GetoptAppConfig::CGIGetopt::Long
๐ Thatโs the whole page, bestie โ source/version perl v5.42.0, dated 2015-04-14, and itโs AppConfig(3). Slay and stay iconic! ๐
โจ
๐ฆ where this page comes from
- opensuse-leap 16.0: perl-AppConfig 1.71-bp160.1.12 ยท Artistic-1.0 or GPL-1.0+
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms