On Thu, Dec 27, 2001 at 07:03:38PM +0100, Eric Van Buggenhaut wrote:
> I wanted to be able to use a config file similar to /etc/passwd like:
> 
> #This is the list of users needed by DBIx::Password
> #(/usr/lib/perl5/DBIx/Password.pm)
> #
> #Syntax is:
> #host:username:password:port:database:attributes:connect:driver:host
> #
> #You can use simple quotes when field contains colon(s)
> 
> acs:root:op.re,13::acs:{}:'DBI:mysql:database=acs:host=localhost':mysql:localhost
> personales:root:op.re,13::acs:{}:'DBI:mysql:database=PaginasPersonales:host=localhost':mysql:localhost
> 

since you have : characters within fields, it's far simpler to use
another character (e.g. pipe) as the field separator, like so:

acs|root|op.re,13||acs|{}|DBI:mysql:database=acs:host=localhost|mysql|localhost
personales|root|op.re,13||acs|{}|DBI:mysql:database=PaginasPersonales:host=localhost|mysql|localhost

TAB characters would be another good choice for field separator...or
anything which isn't going to appear within the fields.

> while (<IN>) {
>         next if (/^#/ || /^$/);
>         @host = m/:?([^':]*)||:?'([^']*)'/g;
>         foreach (@host) {print "$_ "};
>         print "\n";
> }

try:

# set up an array containing the field names in order, so that
# we can use a for loop rather than a whole bunch of assignment
# statements.
@fields = qw(hostname username password port database attributes 
             connect driver dbhost);

my %virtual1 = {};

while (<>) {
          chomp ;
                  s/#.*//;          # strip comments
                  s/^\s*|\s*$//g;   # strip leading & trailing spaces
                  next if (/^$/);   # ignore blank lines (incl. comments)
                  my @line = split /\|/ ;

                  # do whatever you need with @line
                  # $line[0] = hostname
                  # $line[1] = username
                  # $line[2] = password
                  # ...
                  # $line[8] = dbhost
                  foreach(1..8) {  # loop from $fields[1]..$fields[8]
                    $virtual1->{$line[0]}->{$fields[$_]} = $line[$_] ;
                  } ;

};
close(IN);

you can verify that this does what you want by using the Data::Dumper
module. e.g. by adding something like the following lines to the script:

    use Data::Dumper ;
        print $Dumper($virtual1);




alternatively, use the IniConf module (in package libiniconf-perl).  it
uses ugly multi-line windows style .ini configurations, but the IniConf
module parses it automatically into a hash for you.  it's almost ideal
for what you want to do, if you can handle the ugliness of .ini style
configurations.


craig

-- 
craig sanders <[EMAIL PROTECTED]>

Fabricati Diem, PVNC.
 -- motto of the Ankh-Morpork City Watch


Reply via email to