Использование 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
не будет сумасшедших пробелов.
! Предупреждение: я, вероятно, не знаю, о чем говорю.