Хорошо, таким образом, я использую жемчуг для чтения в файле, который содержит некоторые общие данные конфигурации. Эти данные организованы в заголовки на основе того, что они имеют в виду. Пример следует:
[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++ считать информацию. И, это более читаемо (и файл конфигурации и сгенерированный файл). Спасибо за обратную связь это действительно помогло.
Если вы делаете этот синтаксический анализ в качестве обучающего упражнения, ничего страшного. Однако в CPAN есть несколько модулей, которые сделают за вас большую часть работы.
use Config::Simple;
Config::Simple->import_from( 'some_config_file.txt', \my %conf );
Этот код помогает (и более эффективен без реверсирования).
for (@line) {
s/^\s+//;
s/\s+$//;
}
Вы, наверное, уже все выяснили, но я подумал, что добавлю немного. Если вы
sub makeref($)
{
my @line = (split(/=/));
foreach (@line)
{
s/^\s+//g;
s/\s+$//g;
}
}
, вы удалите пробелы до и после левой и правой стороны. Так что-то вроде:
this is a parameter = all sorts of stuff here
не будет сумасшедших пробелов.
!! Предупреждение: я, наверное, не понимаю, о чем говорю !!
Похоже, вы поняли. Удалите пробелы перед разделением.
sub makeref($)
{
s/\s+//g;
my @line = (split(/=/)); # gets ["verbose", "true"]
}
split
разбивается на регулярное выражение, поэтому вы можете просто поместить пробел вокруг знака =
в его регулярное выражение:
split (/\s*=\s*/, $line);
Очевидно, вы не хотите удалять все пробелы, или такая строка будет создана (в строке отсутствуют пробелы):
$str="Hellothere!";
Я полагаю, что достаточно удалить только пробелы в начале и в конце строки:
$line =~ s/^\s*(.*?)\s*$/$1/;
Более простая альтернатива с двумя операторами:
$line =~ s/^\s+//;
$line =~ s/\s+$//;