Как я могу разобрать этот формат файла конфигурации (разрешив комментарии) в Perl? - PullRequest
0 голосов
/ 04 апреля 2010

Я читаю некоторые параметры (из пользовательского ввода) из файла .txt и хочу убедиться, что мой сценарий мог прочитать его, даже если пользователь оставил пробел или табуляцию до этого конкретного параметра.

Также, если я хочу добавить комментарий для каждого параметра, за которым следует #, после параметра (например, 7870 # this is default port number), чтобы пользователь знал о параметре

Как мне добиться этого в том же файле?

Прямо сейчас я использую split /\|\s/.

Код:

$data_file="config.txt";
open(RAK, $data_file)|| die("Could not open file!");
@raw_data=<RAK>; 

@Ftp_Server =split(/\|\s/,$raw_data[32]);

config.txt (файл ввода пользователя)

PING_TTL   |   1
CLIENT_PORT |   7870
FTP_SERVER  |   192.162.522.222

Может ли какой-нибудь орган предложить мне надежный способ сделать это?

/ каменистый

Ответы [ 5 ]

6 голосов
/ 04 апреля 2010

Если вы не делаете это в качестве учебного упражнения, лучшим подходом является использование модуля синтаксического анализа конфигурации из CPAN. Вот иллюстрация с использованием Config :: General , который достаточно гибок, чтобы вместить ваш необычный разделитель, и обеспечивает хороший доступ в стиле OO к параметрам конфигурации. [Примечание: чтобы использовать этот пример, вам сначала нужно установить модуль Config::General. Я упоминаю об этом, потому что, похоже, у вас возникли проблемы с примером Sinan, который также требует установки модуля из CPAN.]

use strict;
use warnings;
use Config::General;

my $c = Config::General->new(
    -ConfigFile     => $ARGV[0],
    -SplitPolicy    => 'custom',     # Define | as our delimiter.
    -SplitDelimiter => qr/\s*\|\s*/,
    -ExtendedAccess => 1,            # Allow OO-style access.
);

print $_, "\n" for
    $c->PING_TTL,
    $c->CLIENT_PORT,
    $c->FTP_SERVER,
    $c->FOO,
;

Тестовый файл конфигурации:

PING_TTL    | 1               # default ping interval is 1 second
CLIENT_PORT | 7870            # default port
FTP_SERVER  | 192.162.522.222 # ftp server ip address
FOO         | abcd            # Make sure we can handle # and | in comments

Выход:

1
7870
192.162.522.222
abcd
1 голос
/ 04 апреля 2010

Не изобретай велосипед. Есть много хороших модулей CPAN для обработки данных конфигурации в файлах. Один такой общий модуль (фактически семейство модулей) - YAML :

use YAML::Tiny;
my $yaml = YAML::Tiny->new;
$yaml = YAML::Tiny->read('myapp_config.yml');
1 голос
/ 04 апреля 2010

Итак, что делает ваша программа, если в строке 42 указано FTP_SERVER?

#!/usr/bin/perl

use strict; use warnings;

my %param;

while ( my $param = <DATA> ) {
    last unless $param =~ /[|]/;
    chomp $param;
    $param =~ s/^\s+//;
    $param =~ s/\s+$//;

    my ($name, $rest) = split /\s* [|] \s*/x, $param;
    my ($value, $comment) = split /\s* [#]  \s*/x, $rest, 2 ;

    $param{$name}{value} = $value;
    $param{$name}{comment} = $comment;
}

use YAML;
print Dump \%param;

__DATA__
PING_TTL   |   1 # default ping interval is 1 second
CLIENT_PORT |   7870 # default port
FTP_SERVER  |   192.162.522.222 # ftp server ip address

Выход:

---
CLIENT_PORT:
  comment: default port
  value: 7870
FTP_SERVER:
  comment: ftp server ip address
  value: 192.162.522.222
PING_TTL:
  comment: default ping interval is 1 second
  value: 1
0 голосов
/ 04 апреля 2010

Для удаления пробелов по обе стороны от бара используйте

 split / \s* \| \s* /x , $string 

Это не обрабатывает пробел в начале и конце строки. Для этого сделайте

 $string =~ s/ ^ \s+ //x ;
 $string =~ s/ \s+ $ //x ;

Чтобы удалить комментарии, вы можете сделать что-то вроде

 $string =~ s/#[^|]*//g ;

Это высказывание удаляет # и все, что следует за ним, не |. Вы можете встроить это в split, но это не будет обрабатывать последнюю строку, поэтому я считаю, что лучше обрабатывать # и разбиение отдельно.

Сказав это, если вы хотите надежный способ, я бы посмотрел на один из модулей Config :: *

0 голосов
/ 04 апреля 2010

возможно разделить на пробел в общем

split(/\s+/, ..);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...