1NAME 2 Config::IniFiles - A module for reading .ini-style configuration files. 3 4SYNOPSIS 5 use Config::IniFiles; 6 my $cfg = new Config::IniFiles( -file => "/path/configfile.ini" ); 7 print "We have parm " . $cfg->val( 'Section', 'Parameter' ) . "." 8 if $cfg->val( 'Section', 'Parameter' ); 9 10DESCRIPTION 11 Config::IniFiles provides a way to have readable configuration files 12 outside your Perl script. Configurations can be imported (inherited, 13 stacked,...), sections can be grouped, and settings can be accessed from 14 a tied hash. 15 16FILE FORMAT 17 INI files consist of a number of sections, each preceded with the 18 section name in square brackets. The first non-blank character of the 19 line indicating a section must be a left bracket and the last nonblank 20 character of a line indicating a section must be a right bracket. The 21 characters making up the section name can be any symbols at all. However 22 section names must be unique. 23 24 Parameters are specified in each section as Name=Value. Any spaces 25 around the equals sign will be ignored, and the value extends to the end 26 of the line. Parameter names are localized to the namespace of the 27 section, but must be unique within a section. 28 29 [section] 30 Parameter=Value 31 32 Both the hash mark (#) and the semicolon (;) are comment characters. by 33 default (this can be changed by configuration) Lines that begin with 34 either of these characters will be ignored. Any amount of whitespace may 35 preceed the comment character. 36 37 Multiline or multi-valued parameters may also be defined ala UNIX "here 38 document" syntax: 39 40 Parameter=<<EOT 41 value/line 1 42 value/line 2 43 EOT 44 45 You may use any string you want in place of "EOT". Note that what 46 follows the "<<" and what appears at the end of the text MUST match 47 exactly, including any trailing whitespace. 48 49 As a configuration option (default is off), continuation lines can be 50 allowed: 51 52 [Section] 53 Parameter=this paramater \ 54 spreads across \ 55 a few lines 56 57USAGE -- Object Interface 58 Get a new Config::IniFiles object with the *new* method: 59 60 $cfg = Config::IniFiles->new( -file => "/path/configfile.ini" ); 61 $cfg = new Config::IniFiles -file => "/path/configfile.ini"; 62 63 Optional named parameters may be specified after the configuration file 64 name. See the *new* in the METHODS section, below. 65 66 Values from the config file are fetched with the val method: 67 68 $value = $cfg->val('Section', 'Parameter'); 69 70 If you want a multi-line/value field returned as an array, just specify 71 an array as the receiver: 72 73 @values = $cfg->val('Section', 'Parameter'); 74 75METHODS 76 new ( [-option=>value ...] ) 77 78 Returns a new configuration object (or "undef" if the configuration file 79 has an error). One Config::IniFiles object is required per configuration 80 file. The following named parameters are available: 81 82 *-file* filename 83 Specifies a file to load the parameters from. This 'file' may 84 actually be any of the following things: 85 86 1) a simple filehandle, such as STDIN 87 2) a filehandle glob, such as *CONFIG 88 3) a reference to a glob, such as \*CONFIG 89 4) an IO::File object 90 5) the pathname of a file 91 92 If this option is not specified, (i.e. you are creating a 93 config file from scratch) you must specify a target file using 94 SetFileName in order to save the parameters. 95 96 *-default* section 97 Specifies a section to be used for default values. For 98 example, if you look up the "permissions" parameter in the 99 "users" section, but there is none, Config::IniFiles will look 100 to your default section for a "permissions" value before 101 returning undef. 102 103 *-reloadwarn* 0|1 104 Set -reloadwarn => 1 to enable a warning message (output to 105 STDERR) whenever the config file is reloaded. The reload 106 message is of the form: 107 108 PID <PID> reloading config file <file> at YYYY.MM.DD HH:MM:SS 109 110 Default behavior is to not warn (i.e. -reloadwarn => 0). 111 112 *-nocase* 0|1 113 Set -nocase => 1 to handle the config file in a 114 case-insensitive manner (case in values is preserved, 115 however). By default, config files are case-sensitive (i.e., a 116 section named 'Test' is not the same as a section named 117 'test'). Note that there is an added overhead for turning off 118 case sensitivity. 119 120 *-allowcontinue* 0|1 121 Set -allowcontinue => 1 to enable continuation lines in the 122 config file. i.e. if a line ends with a backslash "\", then 123 the following line is appended to the parameter value, 124 dropping the backslash and the newline character(s). 125 126 Default behavior is to keep a trailing backslash "\" as a 127 parameter value. Note that continuation cannot be mixed with 128 the "here" value syntax. 129 130 *-import* object 131 This allows you to import or inherit existing setting from 132 another Config::IniFiles object. When importing settings from 133 another object, sections with the same name will be merged and 134 parameters that are defined in both the imported object and 135 the *-file* will take the value of given in the *-file*. 136 137 If a *-default* section is also given on this call, and it 138 does not coincide with the default of the imported object, the 139 new default section will be used instead. If no *-default* 140 section is given, then the default of the imported object will 141 be used. 142 143 *-commentchar* 'char' 144 The default comment character is "#". You may change this by 145 specifying this option to an arbitrary character, except 146 alphanumeric characters and square brackets and the "equal" 147 sign. 148 149 *-allowedcommentchars* 'chars' 150 Allowed default comment characters are "#" and ";". By 151 specifying this option you may enlarge or narrow this range to 152 a set of characters (concatenating them to a string). Note 153 that the character specified by -commentchar (see above) is 154 always part of the allowed comment characters. Note: The given 155 string is evaluated as a character class (ie: like 156 "/[chars]/"). 157 158 val ($section, $parameter) 159 160 Returns the value of the specified parameter ("$parameter") in section 161 "$section", returns undef if no section or no parameter for the given 162 section section exists. 163 164 If you want a multi-line/value field returned as an array, just specify 165 an array as the receiver: 166 167 @values = $cfg->val('Section', 'Parameter'); 168 169 A multi-line/value field that is returned in a scalar context will be 170 joined using $/ (input record separator, default is \n) if defined, 171 otherwise the values will be joined using \n. 172 173 setval ($section, $parameter, $value, [ $value2, ... ]) 174 175 Sets the value of parameter "$parameter" in section "$section" to 176 "$value" (or to a set of values). See below for methods to write the new 177 configuration back out to a file. 178 179 You may not set a parameter that didn't exist in the original 180 configuration file. setval will return *undef* if this is attempted. See 181 newval below to do this. Otherwise, it returns 1. 182 183 newval($section, $parameter, $value [, $value2, ...]) 184 185 Assignes a new value, "$value" (or set of values) to the parameter 186 "$parameter" in section "$section" in the configuration file. 187 188 delval($section, $parameter) 189 190 Deletes the specified parameter from the configuration file 191 192 ReadConfig 193 194 Forces the configuration file to be re-read. Returns undef if the file 195 can not be opened, no filename was defined (with the "-file" option) 196 when the object was constructed, or an error occurred while reading. 197 198 If an error occurs while parsinf the INI file the 199 @Config::IniFiles::errors array will contain messages that might help 200 you figure out where the problem is in the file. 201 202 Sections 203 204 Returns an array containing section names in the configuration file. If 205 the *nocase* option was turned on when the config object was created, 206 the section names will be returned in lowercase. 207 208 SectionExists ( $sect_name ) 209 210 Returns 1 if the specified section exists in the INI file, 0 otherwise 211 (undefined if section_name is not defined). 212 213 AddSection ( $sect_name ) 214 215 Ensures that the named section exists in the INI file. If the section 216 already exists, nothing is done. In this case, the "new" section will 217 possibly contain data already. 218 219 If you really need to have a new section with no parameters in it, check 220 that the name that you're adding isn't in the list of sections already. 221 222 DeleteSection ( $sect_name ) 223 224 Completely removes the entire section from the configuration. 225 226 Parameters ($sect_name) 227 228 Returns an array containing the parameters contained in the specified 229 section. 230 231 Groups 232 233 Returns an array containing the names of available groups. 234 235 Groups are specified in the config file as new sections of the form 236 237 [GroupName MemberName] 238 239 This is useful for building up lists. Note that parameters within a 240 "member" section are referenced normally (i.e., the section name is 241 still "Groupname Membername", including the space) - the concept of 242 Groups is to aid people building more complex configuration files. 243 244 SetGroupMember ( $sect ) 245 246 Makes sure that the specified section is a member of the appropriate 247 group. 248 249 Only intended for use in newval. 250 251 RemoveGroupMember ( $sect ) 252 253 Makes sure that the specified section is no longer a member of the 254 appropriate group. Only intended for use in DeleteSection. 255 256 GroupMembers ($group) 257 258 Returns an array containing the members of specified $group. Each 259 element of the array is a section name. For example, given the sections 260 261 [Group Element 1] 262 ... 263 264 [Group Element 2] 265 ... 266 267 GroupMembers would return ("Group Element 1", "Group Element 2"). 268 269 WriteConfig ($filename) 270 271 Writes out a new copy of the configuration file. A temporary file 272 (ending in .new) is written out and then renamed to the specified 273 filename. Also see BUGS below. 274 275 RewriteConfig 276 277 Same as WriteConfig, but specifies that the original configuration file 278 should be rewritten. 279 280 SetFileName ($filename) 281 282 If you created the Config::IniFiles object without initialising from a 283 file, or if you just want to change the name of the file to use for 284 ReadConfig/RewriteConfig from now on, use this method. 285 286 Returns $filename if that was a valid name, undef otherwise. 287 288 SetSectionComment($section, @comment) 289 290 Sets the comment for section $section to the lines contained in 291 @comment. 292 293 Each comment line will be prepended with the comment charcter (default 294 is "#") if it doesn't already have a comment character (ie: if the line 295 does not start with whitespace followed by an allowed comment character, 296 default is "#" and ";"). 297 298 To clear a section comment, use DeleteSectionComment ($section) 299 300 GetSectionComment ($section) 301 302 Returns a list of lines, being the comment attached to section $section. 303 In scalar context, returns a string containing the lines of the comment 304 separated by newlines. 305 306 The lines are presented as-is, with whatever comment character was 307 originally used on that line. 308 309 DeleteSectionComment ($section) 310 311 Removes the comment for the specified section. 312 313 SetParameterComment ($section, $parameter, @comment) 314 315 Sets the comment attached to a particular parameter. 316 317 Any line of @comment that does not have a comment character will be 318 prepended with one. See the SetSectionComment($section, @comment) entry 319 elsewhere in this document above 320 321 GetParameterComment ($sect, $parm) 322 323 Gets the comment attached to a parameter. 324 325 DeleteParameterComment ($sect, $parm) 326 327 Deletes the comment attached to a parameter. 328 329 GetParameterEOT ($section, $parameter) 330 331 Accessor method for the EOT text (in fact, style) of the specified 332 parameter. If any text is used as an EOT mark, this will be returned. If 333 the parameter was not recorded using HERE style multiple lines, 334 GetParameterEOT returns undef. 335 336 SetParameterEOT ($section, $EOT) 337 338 Accessor method for the EOT text for the specified parameter. Sets the 339 HERE style marker text to the value $EOT. Once the EOT text is set, that 340 parameter will be saved in HERE style. 341 342 To un-set the EOT text, use DeleteParameterEOT ($section, $parameter). 343 344 DeleteParameterEOT ($sect, $parm) 345 346 Removes the EOT marker for the given section and parameter. When writing 347 a configuration file, if no EOT marker is defined then "EOT" is used. 348 349 Delete 350 351 Deletes the entire configuration file in memory. 352 353USAGE -- Tied Hash 354 tie $ini, 'Config::IniFiles', (-file=>$filename, [-option=>value ...] ) 355 356 Using "tie", you can tie a hash to a Config::IniFiles object. This 357 creates a new object which you can access through your hash, so you use 358 this instead of the new method. This actually creates a hash of hashes 359 to access the values in the INI file. The options you provide through 360 "tie" are the same as given for the new method, above. 361 362 Here's an example: 363 364 use Config::IniFiles; 365 366 my %ini 367 tie %ini, 'Config::IniFiles', ( -file => "/path/configfile.ini" ); 368 369 print "We have $ini{Section}{Parameter}." if $ini{Section}{Parameter}; 370 371 Accessing and using the hash works just like accessing a regular hash 372 and many of the object methods are made available through the hash 373 interface. 374 375 For those methods that do not coincide with the hash paradigm, you can 376 use the Perl "tied" function to get at the underlying object tied to the 377 hash and call methods on that object. For example, to write the hash out 378 to a new ini file, you would do something like this: 379 380 tied( %ini )->WriteConfig( "/newpath/newconfig.ini" ) || 381 die "Could not write settings to new file."; 382 383 $val = $ini{$section}{$parameter} 384 385 Returns the value of $parameter in $section. 386 387 Because of limitations in Perl's tie implementation, multiline values 388 accessed through a hash will *always* be returned as a single value with 389 each line joined by the default line separator ($\). To break them apart 390 you can simple do this: 391 392 @lines = split( "$\", $ini{section}{multi_line_parameter} ); 393 394 $ini{$section}{$parameter} = $value; 395 396 Sets the value of "$parameter" in "$section" to "$value". 397 398 To set a multiline or multiv-alue parameter just assign an array 399 reference to the hash entry, like this: 400 401 $ini{$section}{$parameter} = [$value1, $value2, ...]; 402 403 If the parameter did not exist in the original file, it will be created. 404 However, Perl does not seem to extend autovivification to tied hashes. 405 That means that if you try to say 406 407 $ini{new_section}{new_paramters} = $val; 408 409 and the section 'new_section' does not exist, then Perl won't properly 410 create it. In order to work around this you will need to create a hash 411 reference in that section and then assign the parameter value. Something 412 like this should do nicely: 413 414 $ini{new_section} = {}; 415 $ini{new_section}{new_paramters} = $val; 416 417 %hash = %{$ini{$section}} 418 419 Using the tie interface, you can copy whole sections of the ini file 420 into another hash. Note that this makes a copy of the entire section. 421 The new hash in no longer tied to the ini file, In particular, this 422 means -default and -nocase settings will not apply to "%hash". 423 424 $ini{$section} = {}; %{$ini{$section}} = %parameters; 425 426 Through the hash interface, you have the ability to replace the entire 427 section with a new set of parameters. This call will fail, however, if 428 the argument passed in NOT a hash reference. You must use both lines, as 429 shown above so that Perl recognizes the section as a hash reference 430 context before COPYing over the values from your "%parameters" hash. 431 432 delete $ini{$section}{$parameter} 433 434 When tied to a hash, you can use the Perl "delete" function to 435 completely remove a parameter from a section. 436 437 delete $ini{$section} 438 439 The tied interface also allows you to delete an entire section from the 440 ini file using the Perl "delete" function. 441 442 %ini = (); 443 444 If you really want to delete all the items in the ini file, this will do 445 it. Of course, the changes won't be written to the actual file unless 446 you call RewriteConfig on the object tied to the hash. 447 448 Parameter names 449 450 my @keys = keys %{$ini{$section}} 451 while (($k, $v) = each %{$ini{$section}}) {...} 452 if( exists %{$ini{$section}}, $parameter ) {...} 453 When tied to a hash, you use the Perl "keys" and "each" functions to 454 iteratively list the parameters ("keys") or parameters and their values 455 ("each") in a given section. 456 457 You can also use the Perl "exists" function to see if a parameter is 458 defined in a given section. 459 460 Note that none of these will return parameter names that are part if the 461 default section (if set), although accessing an unknown parameter in the 462 specified section will return a value from the default section if there 463 is one. 464 465 Section names 466 467 foreach( keys %ini ) {...} 468 while (($k, $v) = each %ini) {...} 469 if( exists %ini, $section ) {...} 470 When tied to a hash, you use the Perl "keys" and "each" functions to 471 iteratively list the sections in the ini file. 472 473 You can also use the Perl "exists" function to see if a section is 474 defined in the file. 475 476DIAGNOSTICS 477 @Config::IniFiles::errors 478 479 Contains a list of errors encountered while parsing the configuration 480 file. If the *new* method returns undef, check the value of this to find 481 out what's wrong. This value is reset each time a config file is read. 482 483BUGS 484 * The output from [Re]WriteConfig/OutputConfig might not be as pretty 485 as it can be. Comments are tied to whatever was immediately below 486 them. And case is not preserved for Section and Parameter names if 487 the -nocase option was used. 488 489 * No locking is done by [Re]WriteConfig. When writing servers, take 490 care that only the parent ever calls this, and consider making your 491 own backup. 492 493Data Structure 494 Note that this is only a reference for the package maintainers - one of 495 the upcoming revisions to this package will include a total clean up of 496 the data structure. 497 498 $iniconf->{cf} = "config_file_name" 499 ->{startup_settings} = \%orginal_object_parameters 500 ->{firstload} = 0 501 ->{nocase} = 0 502 ->{reloadwarn} = 0 503 ->{sects} = \@sections 504 ->{sCMT}{$sect} = \@comment_lines 505 ->{group}{$group} = \@group_members 506 ->{parms}{$sect} = \@section_parms 507 ->{EOT}{$sect}{$parm} = "end of text string" 508 ->{pCMT}{$sect}{$parm} = \@comment_lines 509 ->{v}{$sect}{$parm} = $value OR \@values 510 511AUTHOR and ACKNOWLEDGEMENTS 512 The original code was written by Scott Hutton. Then handled for a time 513 by Rich Bowen (thanks!), It is now managed by Jeremy Wadsack, with many 514 contributions from various other people. 515 516 In particular, special thanks go to (in roughly chronological order): 517 518 Bernie Cosell, Alan Young, Alex Satrapa, Mike Blazer, Wilbert van de 519 Pieterman, Steve Campbell, Robert Konigsberg, Scott Dellinger, R. 520 Bernstein, Daniel Winkelmann, Pires Claudio, Adrian Phillips, Marek 521 Rouchal, Luc St Louis, Adam Fischler, Kay R�pke, Matt Wilson, Raviraj 522 Murdeshwar and Slaven Rezic. 523 524 Geez, that's a lot of people. And apologies to the folks who were 525 missed. 526 527 If you want someone to bug about this, that would be: 528 529 Jeremy Wadsack <dgsupport at wadsack-allen dot com> 530 531 If you want more information, or want to participate, go to: 532 533 http://sourceforge.net/projects/config-inifiles/ 534 535 Please send bug reports to config-inifiles-bugs@lists.sourceforge.net 536 537 Development discussion occurs on the mailing list 538 config-inifiles-dev@lists.sourceforge.net, which you can subscribe to by 539 going to the project web site (link above). 540 541 This program is free software; you can redistribute it and/or modify it 542 under the same terms as Perl itself. 543 544Change log 545 $Log: README,v $ 546 Revision 1.1 2002/12/06 02:04:50 russ 547 *** empty log message *** 548 549 Revision 1.15 2002/10/15 18:52:56 wadg 550 Updated with changelog 551 552 Revision 2.30 2002/10/15 18:51:07 wadg 553 Patched to stopwarnings about utf8 usage. 554 555 Revision 2.29 2002/08/15 21:33:58 wadg 556 - Support for UTF Byte-Order-Mark (Raviraj Murdeshwar) 557 - Made tests portable to Mac (p. kent) 558 - Made file parsing portable for s390/EBCDIC, etc. (Adam Fischler) 559 - Fixed import bug with Perl 5.8.0 (Marek Rouchal) 560 - Fixed precedence bug in WriteConfig (Luc St Louis) 561 - Fixed broken group detection in SetGroupMember and RemoveGroupMember (Kay R�pke) 562 - Added line continuation character (/) support (Marek Rouchal) 563 - Added configurable comment character support (Marek Rouchal) 564 565 Revision 2.28 2002/07/04 03:56:05 grail 566 Changes for resolving bug 447532 - _section::FETCH should return array ref for multiline values. 567 568 Revision 2.27 2001/12/20 16:03:49 wadg 569 - Fixed bug introduced in new valid file check where ';' comments in first lines were not considered valid 570 - Rearranged some tests to put them in the proper files (case and -default) 571 - Added more comment test to cover more cases 572 - Fixed first two comments tests which weren't doing anything 573 574 Revision 2.26 2001/12/19 22:20:50 wadg 575 #481513 Recognize badly formatted files 576 577 Revision 2.25 2001/12/12 20:44:48 wadg 578 Update to bring CVS version in synch 579 580 Revision 2.24 2001/12/07 10:03:06 wadg 581 222444 Ability to load from arbitrary source 582 583 Revision 2.23 2001/12/07 09:35:06 wadg 584 Forgot to include updates t/test.ini 585 586 Revision 2.22 2001/12/06 16:52:39 wadg 587 Fixed bugs 482353,233372. Updated doc for new mgr. 588 589 Revision 2.21 2001/08/14 01:49:06 wadg 590 Bug fix: multiple blank lines counted as one 591 Patched README change log to include recent updates 592 593 Revision 2.20 2001/06/07 02:49:52 grail 594 - Added checks for method parameters being defined 595 - fixed some regexes to make them stricter 596 - Fixed greps to make them consistent through the code (also a vain 597 attempt to help my editors do syntax colouring properly) 598 - Added AddSection method, replaced chunk of ReadConfig with AddSection 599 - Added case handling stuff to more methods 600 - Added RemoveGroupMember 601 - Made variable names more consistent through OO methods 602 - Restored Unix EOLs 603 604 Revision 2.19 2001/04/04 23:33:40 wadg 605 Fixed case sensitivity bug 606 607 Revision 2.18 2001/03/30 04:41:08 rbowen 608 Small documentation change in IniFiles.pm - pod2* was choking on misplaces 609 =item tags. And I regenerated the README 610 The main reason for this release is that the MANIFEST in the 2.17 version was 611 missing one of the new test suite files, and that is included in this 612 re-release. 613 614 Revision 2.17 2001/03/21 21:05:12 wadg 615 Documentation edits 616 617 Revision 2.16 2001/03/21 19:59:09 wadg 618 410327 -default not in original; 233255 substring parameters 619 620 Revision 2.15 2001/01/30 11:46:48 rbowen 621 Very minor documentation bug fixed. 622 623 Revision 2.14 2001/01/08 18:02:32 wadg 624 [Bug #127325] Fixed proken import; changelog; moved 625 626 Revision 2.13 2000/12/18 07:14:41 wadg 627 [Bugs# 122441,122437] Alien EOLs and OO delete method 628 629 Revision 2.12 2000/12/18 04:59:37 wadg 630 [Bug #125524] Writing multiline of 2 with tied hash 631 632 Revision 2.11 2000/12/16 12:53:13 grail 633 [BUG #122455] Problem with File Permissions 634 635 Revision 2.10 2000/12/13 17:40:18 rbowen 636 Updated version number so that CPAN will stop being angry with us. 637 638 Revision 1.18 2000/12/08 00:45:35 grail 639 Change as requested by Jeremy Wadsack, for Bug 123146 640 641 Revision 1.17 2000/12/07 15:32:36 grail 642 Further patch to duplicate sections bug, and replacement of repeated values handling code. 643 644 Revision 1.14 2000/11/29 11:26:03 grail 645 Updates for task 22401 (no more reloadsig) and 22402 (Group and GroupMember doco) 646 647 Revision 1.13 2000/11/28 12:41:42 grail 648 Added test for being able to add sections with wierd names like section|version2 649 650 Revision 1.11 2000/11/24 21:20:11 rbowen 651 Resolved SourceForge bug #122445 - a parameter should be split from its value on the first = sign encountered, not on the last one. Added test suite to test this, and put test case in test.ini 652 653 Revision 1.10 2000/11/24 20:40:58 rbowen 654 Updated MANIFEST to have file list of new files in t/ 655 Updated IniFiles.pm to have mention of sourceforge addresses, rather than rcbowen.com addresses 656 Regenerated README from IniFiles.pm 657 658 Revision 1.9 2000/11/23 05:08:08 grail 659 Fixed documentation for bug 122443 - Check that INI files can be created from scratch. 660 661 Revision 1.1.1.1 2000/11/10 03:04:01 rbowen 662 Initial checkin of the Config::IniFiles source to SourceForge 663 664 Revision 1.8 2000/10/17 01:52:55 rbowen 665 Patch from Jeremy. Fixed "defined" warnings. 666 667 Revision 1.7 2000/09/21 11:19:17 rbowen 668 Mostly documentation changes. I moved the change log into the POD rather 669 than having it in a separate Changes file. This allows people to see the 670 changes in the Readme before they download the module. Now I just 671 need to make sure I remember to regenerate the Readme every time I do 672 a commit. 673 674 1.6 September 19, 2000 by JW, AS 675 * Applied several patches submitted to me by Jeremy and Alex. 676 * Changed version number to the CVS version number, so that I won't 677 have to think about changing it ever again. Big version change 678 should not be taken as a huge leap forward. 679 680 0.12 September 13, 2000 by JW/WADG 681 * Added documentation to clarify autovivification issues when 682 creating new sections 683 * Fixed version number (Oops!) 684 685 0.11 September 13, 2000 by JW/WADG 686 * Applied patch to Group and GroupMembers functions to return empty 687 list when no groups are present (submitted by John Bass, Sep 13) 688 689 0.10 September 13, 2000 by JW/WADG 690 * Fixed reference in POD to ReWriteFile. changes to RewriteConfig 691 * Applied patch for failed open bug submitted by Mordechai T. Abzug Aug 18 692 * Doc'd behavior of failed open 693 * Removed planned SIG testing from test.pl as SIGs have been removed 694 * Applied patch from Thibault Deflers to fix bug in parameter list 695 when a parameter value is undef 696 697 0.09 698 Hey! Where's the change log for 0.09? 699 700 0.08 701 2000-07-30 Adrian Phillips <adrianp@powertech.no> 702 703 * test.pl: Fixed some tests which use $\, and made those that try 704 to check a non existant val check against ! defined. 705 706 * IniFiles.pm: hopefully fixed use of $\ when this is unset 707 (problems found when running tests with -w). Similar problem with 708 $/ which can be undefined and trying to return a val which does 709 not exist. Modified val docs section to indicate a undef return 710 when this occurs. 711 712 0.07 713 Looks like we missed a change log for 0.07. Bummer. 714 715 0.06 Sun Jun 25, 2000 by Daniel Winkelmann 716 * Patch for uninitialized value bug in newval and setval 717 718 0.05 Sun Jun 18, 2000 by RBOW 719 * Added something to shut up -w on VERSIONS 720 * Removed unused variables 721 722 0.04 Thu Jun 15 - Fri Jun 16, 2000 by JW/WADG 723 * Added support for -import option on ->new 724 * Added support for tying a hash 725 * Edited POD for grammer, clarity and updates 726 * Updated test.pl file 727 * Fixed bug in multiline/single line output 728 * Fixed bug in default handling with tie interface 729 * Added bugs to test.pl for regression 730 * Fixed bug in {group} vs. {groups} property (first is valid) 731 * Fixed return value for empty {sects} or {parms}{$sect} in 732 Sections and Parameters methods 733 734 0.03 Thu Jun 15, 2000 by RBOW 735 * Modifications to permit 'use strict', and to get 'make test' working 736 again. 737 738 0.02 Tue Jun 13, 2000 by RBOW 739 * Fixed bug reported by Bernie Cosell - Sections, Parameters, 740 and GroupMembers return undef if there are no sections, 741 parameters, or group members. These functions now return 742 () if the particular value is undefined. 743 * Added some contributed documentation, from Alex Satrapa, explaining 744 how the internal data structure works. 745 * Set up a project on SourceForge. (Not a change, but worth 746 noting). 747 * Added Groups method to return a list of section groups. 748 749 0.01 Mon Jun 12, 2000 by RBOW 750 Some general code cleanup, in preparation for changes to 751 come. Put up Majordomo mailing list and sent invitation to 752 various people to join it. 753 754