Regex 使用perl拆分可能包含空格的行

Regex 使用perl拆分可能包含空格的行,regex,perl,split,whitespace,Regex,Perl,Split,Whitespace,好的,我使用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 understa

好的,我使用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;”,我想使用perl中的split函数创建一个数组,其中包含字符“$var”和“10”作为元素。以另一行为例:

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

这是需要的,因为我将把这些值输出到一个新文件(其中一块C++代码将被读取)来实例化字典对象。只是想让你尝一尝它可能是什么样子(只是在我继续的过程中虚构出来):

要回答一个问题,为什么我不使用Config::Simple,是因为我最初不知道我的配置文件会是什么样子,只知道我希望它做什么。我一边写一边用perl解析文件,至少我觉得这是合理的


问题是我有一些C++代码,它将加载配置文件中的信息,但是因为在C或C++中解析是:(我决定使用Perl。这也是我学习语言的一个好的练习。所以,Perl代码并不是真正地与我的应用程序分开,它只是让C++代码更容易阅读信息,而且它更可读(配置文件和生成的文件)。.谢谢你的反馈,真的很有帮助。

看起来你已经得到了。在拆分之前去掉空白

sub makeref($)
{
    s/\s+//g;
    my @line = (split(/=/)); # gets ["verbose", "true"]
}
这段代码实现了这一点(并且在不反转的情况下效率更高)


split
在正则表达式上拆分,因此您只需将
=
符号周围的空格放入其正则表达式:

split (/\s*=\s*/, $line);
您显然不想删除所有空格,否则会产生这样一行(字符串中缺少空格):

我想只从行的开头和结尾删除空格就足够了:

$line =~ s/^\s*(.*?)\s*$/$1/;
一个更简单的替代方案,包含两个语句:

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

若你们把这个解析作为一个学习练习,那个没关系。不过,有几个模块可以帮你们做很多工作

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

你可能已经弄明白了,但我想我应该补充一点。如果你

sub makeref($)
{
   my @line = (split(/=/));
   foreach (@line)
   {
      s/^\s+//g;
      s/\s+$//g;
   }
}
然后,您将删除左右两侧前后的空格。这样做类似于:

 this is a parameter         =      all sorts of stuff here
不会有疯狂的空间


!!警告:我可能不知道我在说什么!!

啊,这一点现在很明显。谢谢,我是perl新手,它是一种非常酷的语言。奇怪的是,chomp并没有chomp空格!你是对的,我考虑过,正则表达式解决方案更好,继续吧。请注意语法突出显示的混乱。@Tommy Read
perldoc-f chomp
要了解
chomp
的作用,可以在正则表达式的末尾添加一个“g”,以替换多个额外的空白外观。例如,
s/^\s+//g;
请注意混乱的语法突出显示。有许多模块处理配置节、续行和带有多个v的变量CPAN上的值等。学习完毕后使用其中一个。我喜欢
Config::Std
@FM指出的
Config::Simple
。请注意语法突出显示的混乱。这就是为什么我倾向于使用
s{…}{…}
当发布在SO上时。
s/^\s+/
的效率稍高一些。是的,如果有零空格字符,
s/^\s*/
什么都不替换——何必麻烦呢?除非有必要,否则不要使用原型。即使如此,也要三思。当然,这一切都非常强大,应该适度地使用,以使wWorld是一个更好的地方。请看FM的答案。你真的不应该编写自己的文件解析器来完成这样一项常见和标准的工作——使用CPAN,并专注于你的应用程序逻辑。是的,我真的要问,为什么OP使用与标准配置文件格式非常相似的格式,而不是使用标准配置文件读取器模块很容易获得并且经过了很好的测试。(如果Config::Simple与所需的格式不太匹配,那么YAML是另一个很好的选择。)95%的情况下,这是需要的。我有一些原因(学习,不是我所有的代码都是perl)可以让它更容易地以不同的方式完成。
$line =~ s/^\s+//;
$line =~ s/\s+$//;
use Config::Simple;
Config::Simple->import_from( 'some_config_file.txt', \my %conf );
sub makeref($)
{
   my @line = (split(/=/));
   foreach (@line)
   {
      s/^\s+//g;
      s/\s+$//g;
   }
}
 this is a parameter         =      all sorts of stuff here