Использование perl для разделения строки, которая может содержать пробелы

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

[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;", я хотел бы использовать функцию split в perl для создания массива, содержащего символы "$ var" и "10" в качестве элементов. Использование другой строки в качестве примера:

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

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

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"];
}

Чтобы ответить на один вопрос, почему я не использую Config:: Simple, я изначально не знал, как будет выглядеть мой файл конфигурации, только то, что я хотел сделать. Составляя это, когда я шел - по крайней мере, что мне показалось разумным - и используя perl для анализа файла.

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

Ответ 1

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

use Config::Simple;
Config::Simple->import_from( 'some_config_file.txt', \my %conf );

Ответ 2

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

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

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

$str="Hellothere!";

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

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

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

$line =~ s/^\s+//;
$line =~ s/\s+$//;

Ответ 3

Похоже, у вас это есть. Разделите пробелы перед расщеплением.

sub makeref($)
{
    s/\s+//g;
    my @line = (split(/=/)); # gets ["verbose", "true"]
}

Ответ 4

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

for (@line) {
    s/^\s+//;
    s/\s+$//;
}

Ответ 5

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

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

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

 this is a parameter         =      all sorts of stuff here

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

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