Используя жемчуг для разделения строки, которая может содержать пробел

Хорошо, таким образом, я использую жемчуг для чтения в файле, который содержит некоторые общие данные конфигурации. Эти данные организованы в заголовки на основе того, что они имеют в виду. Пример следует:

[vars]

# This is how we define a variable!
$var = 10;
$str = "Hello thar!";


# This section contains flags which can be used to modify module behavior
# All modules read this file and if they understand any of the flags, use them
[flags] 
  Verbose =       true; # Notice the errant whitespace!

[path]
WinPath = default; # Keyword which loads the standard PATH as defined by the operating system. Append  with additonal values.
LinuxPath = default;

Цель: Используя первую строку как пример "$var = 10"; я хотел бы использовать функцию разделения в жемчуге для создания массива, который содержит символы "$var" и "10" как элементы. Используя другую строку как пример:

    Verbose    =         true;
    # Should become [Verbose, true] aka no whitespace is present

Это необходимо, потому что я буду производить эти значения в новый файл (который другая часть кода C++ считает) инстанцировать объектов словаря. Только, чтобы дать Вам немного вкуса того, на что это могло бы быть похожим (просто составление его, поскольку я продвигаюсь):

define new dictionary
name: [flags]
# Start defining keys => values
new key name: Verbose
new value val: 10 
# End dictionary

О, и вот код, который я в настоящее время имею наряду с тем, что он делает (неправильно):

sub makeref($)
{
    my @line = (split (/=/)); # Produces ["Verbose", "    true"];
}

Для ответа на один вопрос, почему я не использую Конфигурацию:: Простой, то, что я первоначально не знал то, что мой конфигурационный файл будет похож, только что я хотел, чтобы он сделал. Составление его, когда я продвинулся - по крайней мере, что казалось разумным мне - и жемчуг использования для парсинга файла.

Проблема, у меня есть некоторый код C++, который загрузит информацию в файле конфигурации, но начиная с парсинга в C или C++ :( Я решил использовать жемчуг. Это - также хорошее осуществление изучения для меня, так как я плохо знаком с языком. Таким образом, это - вещь, этот код жемчуга не имеет действительно независимо моего приложения, это просто помогает коду C++ считать информацию. И, это более читаемо (и файл конфигурации и сгенерированный файл). Спасибо за обратную связь это действительно помогло.

12
задан Tommy Fisk 19 June 2010 в 00:22
поделиться

5 ответов

Если вы делаете этот синтаксический анализ в качестве обучающего упражнения, ничего страшного. Однако в CPAN есть несколько модулей, которые сделают за вас большую часть работы.

use Config::Simple;
Config::Simple->import_from( 'some_config_file.txt', \my %conf );
6
ответ дан 2 December 2019 в 21:42
поделиться

Этот код помогает (и более эффективен без реверсирования).

for (@line) {
    s/^\s+//;
    s/\s+$//;
}
1
ответ дан 2 December 2019 в 21:42
поделиться

Вы, наверное, уже все выяснили, но я подумал, что добавлю немного. Если вы

sub makeref($)
{
   my @line = (split(/=/));
   foreach (@line)
   {
      s/^\s+//g;
      s/\s+$//g;
   }
}

, вы удалите пробелы до и после левой и правой стороны. Так что-то вроде:

 this is a parameter         =      all sorts of stuff here

не будет сумасшедших пробелов.

!! Предупреждение: я, наверное, не понимаю, о чем говорю !!

0
ответ дан 2 December 2019 в 21:42
поделиться

Похоже, вы поняли. Удалите пробелы перед разделением.

sub makeref($)
{
    s/\s+//g;
    my @line = (split(/=/)); # gets ["verbose", "true"]
}
2
ответ дан 2 December 2019 в 21:42
поделиться

split разбивается на регулярное выражение, поэтому вы можете просто поместить пробел вокруг знака = в его регулярное выражение:

split (/\s*=\s*/, $line);

Очевидно, вы не хотите удалять все пробелы, или такая строка будет создана (в строке отсутствуют пробелы):

$str="Hellothere!";

Я полагаю, что достаточно удалить только пробелы в начале и в конце строки:

$line =~ s/^\s*(.*?)\s*$/$1/;

Более простая альтернатива с двумя операторами:

$line =~ s/^\s+//;
$line =~ s/\s+$//;
3
ответ дан 2 December 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: