Jaki jest najlepszy sposób do analizowania pliku INI w Perlu i przekonwertowania go na mieszanie?Jak mogę uzyskać dostęp do plików INI z Perla?
Odpowiedz
Wolę korzystać z modułu Config::IniFiles.
Config :: IniFiles to bardzo potężny menedżer INI. Dobra rekomendacja. – daotoad
Spróbuj moduł z CPAN: Config::INI::Reader
Jeśli lubisz bardziej perlish styl spróbuj Tie::Cfg
. Próbka:
tie my %conf, 'Tie::Cfg', READ => "/etc/connect.cfg";
$conf{test}="this is a test";
Stosowanie remisu NIE jest zalecane przez "Najlepsze praktyki Perla". –
jest bardzo prosta i łatwa w użyciu.
$Config = Config::Tiny->read('file.conf');
my $one = $Config->{section}->{one};
my $Foo = $Config->{section}->{Foo};
Najlepszym sposobem jest wykorzystanie dostępnych modułów w CPAN, tak jak sugerowały inne. Poniżej jest tylko dla własnego zrozumienia, powiedzmy, że masz ini tak:
$ more test.ini
[Section1]
s1tag1=s1value1 # some comments
[Section2]
s2tag1=s2value1 # some comments
s2tag2=s2value2
[Section3]
s3tag1=s3value1
można zrobić własne parsowania w/o moduły przy użyciu tylko regex Perl (lub metody String) + struktury danych jak skrótów.
Przykładowy kod:
$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";
}
wyjście
$ perl perl.pl
Section1 => s1tag1
Section1 => s1value1
Section3 => s3tag1
Section3 => s3value1
Section2 => s2tag2
Section2 => s2value2
Należy zauważyć, że ten analizator składni zachowuje tylko jedną parę klucz/wartość dla każdej sekcji. – Thelema
Najlepsza praktyka Perla zaleca NIE używanie regex do odczytywania plików konfiguracyjnych, raczej używanie standardowych modułów z CPAN ... Dla plików ini: 'Config :: IniFiles'. –
nitpicking na powyższe:
Tie :: Cfg, jak pobrać z CPAN, nie obsługuje sekcje i klucze, które mogą mieć spacje w nich. Trzeba go zmienić, dodając cytaty (") wokół" kluczy "podczas ustawiania haszu dla sekcji i klawiszy w sekcjach. Pliki, które próbuję odczytać, zostały wygenerowane przez osoby z systemem MS Windows, a tym samym Mają dużo przestrzeni do obejrzenia:
Config :: Tiny, Config :: IniFiles są wybredne co do formatu.Jeśli jakaś linia nie ma postaci [section] lub key = val, rzucają błąd i można nie dostanie się do skrótów, które, przynajmniej w Config :: Files, są poprawnie wypełnione, dobrze byłoby mieć opcję ignorowania błędów, pliki, które próbuję odczytać, zawierają kilka niepoprawnych linii M4, że mogę przejść przez m4, aby się go pozbyć, ale nie jest to konieczne w tym, co próbuję zrobić z tym konkretnym skryptem.
czytanie i funkcję ini edycji plików napisać:
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;
}
wykorzystanie próbki:
odczytu pliku conf i zapisywane do mieszania
$conf = iniRead("/etc/samba/smb.conf");
zmienić swój atrybut konfiguracyjny lub dodano nowe config atrybuty
edycja
$conf->{"global"}->{"workgroup"} = "WORKGROUP";
dodano nowe config
$conf->{"www"}->{"path"}="/var/www/html";
zapisać nową konfigurację do pliku
iniWrite("/etc/samba/smb.conf",$conf);
- 1. Jak mogę uzyskać dane ini w piramidzie?
- 2. Jak uzyskać dostęp do plików projektu z testów NUnit
- 3. Jak uzyskać dostęp do systemu plików z EJB 3?
- 4. Jak mogę uzyskać dostęp do indexedDB synchronicznie?
- 5. Jak uzyskać dostęp do plików zewnętrznych z archiwów Phar?
- 6. Używanie różnych plików ini Eclipse
- 7. Jak mogę uzyskać dostęp do wskaźnika C z fortranu?
- 8. Jak mogę uzyskać dostęp do ListViewItems z ListView WPF?
- 9. Czy można używać wstawianych komentarzy do plików .ini z PHP?
- 10. Jak uzyskać dostęp do chronionych plików S3 w skrypcie CFN?
- 11. Jak uzyskać dostęp do plików lokalnych w ramach projektu
- 12. Testowanie jednostek Visual Studio - jak uzyskać dostęp do plików zewnętrznych?
- 13. Jak uzyskać dostęp do Seconds_Behind_Master z SQL
- 14. W jaki sposób mogę uzyskać dostęp do liczby sprawdzania wartości skrótu w pliku Perla?
- 15. Jak uzyskać dostęp do aplikacjiContext z kontrolera
- 16. Dlaczego nie mogę użyć wartości zmiennej Perla, aby uzyskać dostęp do nazwy zmiennej leksykalnej?
- 17. Jak uzyskać dostęp do aplikacji?
- 18. W jaki sposób mogę uzyskać dostęp do pliku zatwierdzonego z pre-commit Subversion w Perlu?
- 19. Jak uzyskać dostęp do RouteTable.Routes.MapHttpRoute?
- 20. Jak uzyskać dostęp do ViewBag z JS
- 21. Jak uzyskać dostęp do ListView z adaptera
- 22. Jak uzyskać dostęp do ModelState z ActionFilter?
- 23. Jak uzyskać dostęp do Wikipedii z R?
- 24. Jak mogę programowo uzyskać dostęp do historii plików w Windows 8?
- 25. Jak uzyskać dostęp do GetGlobalResourceObject()
- 26. Jak mogę uzyskać dostęp do pliku logcat na urządzeniu
- 27. Czy mogę uzyskać dostęp do IIdentity z Web API
- 28. Czy mogę uzyskać dostęp do elementu struct/class z szablonu?
- 29. Czy mogę uzyskać dostęp do cookie z Socket.io?
- 30. Jak uzyskać dostęp do wspólnego kontenera aplikacji z Cordova?
Najlepszym sposobem jest spojrzenie na CPAN (http://search.cpan.org). :) –