Question

Quelle est la meilleure façon d'analyser le fichier INI en Perl et le convertir en hachage?

Était-ce utile?

La solution

Je préfère utiliser Config :: IniFiles module.

Autres conseils

Si vous aimez le style plus perlienne puis essayez Tie::Cfg . Echantillon:

tie my %conf, 'Tie::Cfg', READ => "/etc/connect.cfg";

$conf{test}="this is a test";

La meilleure façon est d'utiliser des modules disponibles dans CPAN comme ce que les autres ont suggéré. Ci-dessous est juste pour votre compréhension, disons que vous avez le fichier .ini comme ceci:

$ more test.ini
[Section1]
    s1tag1=s1value1             # some comments
[Section2]
    s2tag1=s2value1           # some comments
    s2tag2=s2value2
[Section3]
    s3tag1=s3value1

vous pouvez faire votre propre analyse syntaxique w / o modules en utilisant simplement regex de Perl (ou les méthodes de chaînes) + structures de données comme hash.

Exemple de code:

   $ini="test.ini";
    open (INI, "$ini") || die "Can't open $ini: $!\n";
        while (<INI>) {
            chomp;
            if (/^\s*\[(\w+)\].*/) {
                $section = $1;
            }
            if (/^\W*(\w+)=?(\w+)\W*(#.*)?$/) {
                $keyword = $1;
                $value = $2 ;
                # put them into hash
                $hash{$section} = [ $keyword, $value];
            }
        }
    close (INI);
    while( my( $k, $v ) = each( %hash ) ) {
        print "$k => " . $hash{$k}->[0]."\n";
        print "$k => " . $hash{$k}->[1]."\n";
    }

output

$ perl perl.pl
Section1 => s1tag1
Section1 => s1value1
Section3 => s3tag1
Section3 => s3value1
Section2 => s2tag2
Section2 => s2value2

Config :: minuscule est très facile et simple à utiliser.

$Config = Config::Tiny->read( 'file.conf' );

my $one = $Config->{section}->{one};
my $Foo = $Config->{section}->{Foo};

Essayez ce module CPAN: Config :: :: INI lecteur

tatillonne sur ce qui précède:

Tie :: Cfg, comme téléchargé à partir de CPAN, ne gère pas les sections et les clés qui peuvent avoir des espaces en eux. Il doit être modifié en ajoutant des guillemets ( ") autour des « clés » lors de la configuration des entrées de hachage tant pour la section et les touches dans les sections. Les fichiers que je suis en train de lire ont été générés par les gens de MS Windows, et donc ont beaucoup d'espace pour tout le monde.

Config :: minuscules, Config :: IniFiles sont pointilleux sur le format. Si une ligne n'est pas de la forme [section] ou = val, ils jettent une erreur et on ne peut pas obtenir les hash, qui, au moins dans la configuration :: fichiers, sont remplis correctement de toute façon. Il serait agréable d'avoir une option Ignore d'erreur. Les fichiers que je suis en train de lire ont quelques lignes M4 parasites dans ce que je pouvais courir à travers m4 pour se débarrasser de, mais ce n'est pas nécessaire dans ce que je suis en train de faire avec ce script particulier.

lecture et écriture fonction pour modifier de fichier ini:

sub iniRead
 { 
  my $ini = $_[0];
  my $conf;
  open (INI, "$ini") || die "Can't open $ini: $!\n";
    while (<INI>) {
        chomp;
        if (/^\s*\[\s*(.+?)\s*\]\s*$/) {
            $section = $1;
        }

        if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) {
          $conf->{$section}->{$1} = $2;         
        }
    }
  close (INI);
  return $conf;
}
sub iniWrite
{
  my $ini = $_[0];
  my $conf = $_[1];
  my $contents = '';
foreach my $section ( sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$conf ) {
    my $block = $conf->{$section};
    $contents .= "\n" if length $contents;
    $contents .= "[$section]\n" unless $section eq '_';
    foreach my $property ( sort keys %$block ) {
      $contents .= "$property=$block->{$property}\n";
    }
  }
  open( CONF,"> $ini" ) or print("not open the file");
  print CONF $contents;
  close CONF;
}

Exemple d'utilisation:

lire le fichier et enregistré à conf hachage

$conf = iniRead("/etc/samba/smb.conf");

changer l'attribut de votre configuration ou ajouté de nouveaux attributs de configuration

modifier

$conf->{"global"}->{"workgroup"} = "WORKGROUP";

ajoutée nouvelle configuration

$conf->{"www"}->{"path"}="/var/www/html";

enregistré votre nouvelle configuration dans le fichier

iniWrite("/etc/samba/smb.conf",$conf);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top